2016-06-06 2 views
1
(define (fib n) 
    (fib-iter 1 0 n)) 
(define (fib-iter a b count) 
    (if (= count 0) 
    b 
    (fib-iter (+ a b) a (- count 1)))) 

나는이 코드를 SICP 책에서 가져 왔지만 혼란 스럽다. 피보나치 알고리즘의 아이디어를 완전히 이해하지만이 코드는 나를 괴롭혔다. 정확히 마지막 줄은 무엇입니까? 답변으로, 만약 내가 fib (5), 괜찮아요, 0,1,1,2,3,5 얻을려고 노력하고있어하지만 논리 이상한 것 같습니다.Scheme에서 피보나치 숫자를 찾는 방법은 무엇입니까?

+1

이것은 재귀의 고전적인 예입니다. 재귀를 이해합니까? –

+0

예. 나는이 상황에서 구문에 대해 필요하다고 생각합니다. a + b는 첫 번째 인수, (a + b) + a) 두 번째 인수, 결과 + (count - 1)은 세 번째 인수 여야합니다. 하지만 이것은 잘못된 것 같습니다. – Caleb

+0

@ReutSharabani 실제로는 아니지만, 이것은 피보나치 시리즈의 고전적인 재귀 구현이 아니며, 이것은 _ 구현적인 _ 프로세스 구현입니다. –

답변

2

이 절차는 반복적 인 프로세스로 피보나치 시리즈를 구현합니다. 이 경우 fibfib-iter을 호출하는 주 절차이며 반복을 통해 실제 작업을 수행합니다. count은 우리가 원하는 반복 횟수를 제어하는 ​​데 사용되는 반면, ab은 각각 n-1n-2에 대한 피보나치 시리즈의 결과를 저장하는 데 사용됩니다. 줄 (fib-iter (+ a b) a (- count 1))은 다음 값으로 반복을 진행합니다.

이 책의 반복적 반복 프로세스와 꼬리 재귀에 대해 읽으십시오.이 예제에서는 실제로 발생하는 상황을 이해하기 위해 파악해야하는 개념입니다. 비교를 위해

,의이 같은 절차가 더욱 기존의 구문을 사용하여 (파이썬)를 어떻게 보일지 보자 : 보시다시피

def fib(n): 
    return fib_iter(1, 0, n) 

def fib_iter(a, b, count): 
    while count != 0: # same as asking `(if (= count 0) ...)` 
    a, b = a + b, a # same as passing `(+ a b) a` to recursive call 
    count -= 1  # same as `(- count 1)` 
    return b   # same as returning `b` at end of recursion 

fib_iter 절차는 간단 count에 의해 제어 값의 범위 반복된다 변수에서 ab을 일련의 다음 값에 할당하고 반복 횟수가 완료 될 때까지 반복합니다. 이 시점에서 결과는 b이고 반환됩니다.

+0

정확히 첫 번째 반복이 반환하는 것은 무엇입니까? 두번째? – Caleb

+0

@ Caleb 더 익숙한 구문으로 동일한 코드를 작성했는데, 이제이 점이 더 명확합니까? 내가 틀렸다면, 정정 해줘 –

+0

하십시오 이 제도 코드의 마지막 줄이 같은 것 : - 첫 번째 반복 1 1 4, - 두 번째 반복 2 1 3, - 세 번째 반복 3 2 2, - 다섯 번째 반복 5 3 1. 이것이 맞습니까? – Caleb

관련 문제