2012-12-01 22 views
5

Tôi cần một số trợ giúp để hiểu được quá trình xử lý xảy ra ở đây, vì vậy hãy nói rằng tôi gọi số fib(5) Tôi muốn mã 5, tức là 8. Nhưng bộ não của tôi đang cố gắng hiểu thuật toán cho biết không phải. Đây là cách tôi (sai) nghĩ:Đệ quy trên Fibonacci Sequence

return fib(4) + fib(3) // Stack frame 1 
return fib(3) + fib(1) // Stack frame 2 

nay gây ra x là 1 fib(1), tuyên bố có điều kiện if x == 0 or x == 1: làm cho đệ quy kết thúc. Theo logic của tôi sẽ trở thành 3 + 1 + 4 + 3. Vui lòng sửa lỗi logic của tôi.

def fib(x): 
    """assumes x an int >= 0 
     returns Fibonacci of x""" 
    assert type(x) == int and x >= 0 
    if x == 0 or x == 1: 
     return 1 
    else: 
     return fib(x-1) + fib(x-2) 
+1

Chỉ cần viết trên giấy cuộc gọi đầu tiên và thay thế từng cuộc gọi đệ quy của hàm bằng câu lệnh trả về hợp lệ. Những gì bạn có thể không hiểu là 'return fib (x - 1) + fib (x - 2)' gọi hai lần chức năng fib của bạn, một với ** tham số ** x = ** hiện tại ** x giảm đi một lần, và cái kia bị giảm đi hai lần. Bạn cũng có thể xem xét lại các đối số hàm, vì đây là một sự hiểu lầm điển hình khi sử dụng các hàm (lúc đầu). –

+1

Chỉ cần đặt một số tuyên bố in trong chức năng của bạn và chạy nó để xem những gì nó đang làm. – martineau

Trả lời

6

Đây là sự mở rộng đầy đủ về những gì sẽ xảy ra:

fib(5) expands to fib(4)+fib(3) 
    fib(4) expands to fib(3)+fib(2) 
    fib(3) expands to fib(2)+fib(1) 
     fib(2) expands to fib(1)+fib(0) 
     fib(1) evaluates to 1 
     fib(0) evaluates to 1 
     fib(1) evaluates to 1 
    fib(2) expands to fib(1)+fib(0) 
     fib(1) evaluates to 1 
     fib(0) evaluates to 1 
    fib(3) expands to fib(2)+fib(1) 
    fib(2) expands to fib(1)+fib(0) 
     fib(1) evaluates to 1 
     fib(0) evaluates to 1 
    fib(1) evaluates to 1 

Nếu bạn đếm những người thân, bạn sẽ có được 8 là câu trả lời.

5

Đối với tất cả x lớn hơn 1, các fib chức năng tự gọi mình hai lần:

  1. fib(5) trở thành fib(4) + fib(3)
  2. và mở rộng để (fib(3) + fib(2)) + (fib(2) + fib(1))
  3. và mở rộng để ((fib(2) + fib(1)) + (fib(1) + fib(0))) + ((fib(1) + fib(0)) + 1)
  4. mở rộng để (((fib(1) + fib(0)) + 1) + (1 + 1)) + ((1 + 1) + 1)
  5. mở rộng đến (((1 + 1) + 1) + (1 + 1)) + ((1 + 1) + 1)

có tổng cộng là 8.