2012-05-26 44 views
6

Tôi tự hỏi tại sao cách tiếp cận đầu tiên để giai thừa không hoạt động (vòng lặp vô hạn) trong ruby ​​trong khi thứ hai thực hiện.Vấn đề đệ quy Ruby

def fac (x) 
    if x == 0 
    return 1 
    else 
    return (fac (x-1) * x) 
    end 
end 

def fact(num) 
    return 1 if num == 0 

    fact(num - 1) * num 
end 

Trả lời

7

Sự khác biệt là khoảng trống sau tên phương pháp, không phải cách bạn cấu trúc nếu có.

fac (x-1) * x được phân tích cú pháp là fac((x-1) * x). Về cơ bản, nếu tên phương thức được theo sau bởi dấu cách (hoặc bất kỳ mã thông báo nào không phải là dấu ngoặc đơn mở), thì ruby ​​giả sử bạn đang gọi phương thức mà không có dấu ngoặc đơn. Vì vậy, nó diễn giải các dấu ngoặc đơn xung quanh x-1 làm nhóm, không phải là một phần của cú pháp gọi phương thức.