斐波那契数列迭代?
Fibonacci Sequence iteratively?
我是球拍的新手,我想给一个函数一个整数,它应该 return 它是斐波那契值(迭代)。我不知道我做错了什么,如果我加入一个 if 语句来捕捉数字 = 1 时一切都会中断
(define (fib-iterat n)
(do ((i 1 (+ i 1))
(nextTerm 0 (+ value0 value1))
(value0 0 (+ value1 0))
(value1 1 (+ nextTerm 0)))
((> i n) nextTerm))
)
我得到:
1 = 1
2 = 1
6 = 3
9 = 7
12 = 16
;;; correct
(define (fib n)
(do ((i 0 (+ i 1))
(n1 1 (+ n0 n1))
(n0 0 n1))
((= i n) n0)))
;;; still correct
(define (fib n)
(do ((i 0 (+ i 1))
(n0 0 n1)
(n1 1 (+ n0 n1)))
((= i n) n0)))
;;; wrong
(define (fib-iterat n)
(do ((i 0 (+ i 1))
(value1 1 nextTerm)
(value0 0 value1)
(nextTerm 1 (+ value0 value1))) ; first bracket close
((= i n) (list value0 value1 nextTerm)))) ; second bracket
我从未读过任何"do loop"代码(但应该很容易理解)。你可以这样想。我们将旧状态和新状态分开。在第一个括号中,变量微积分仅使用旧状态值。所以在很多情况下,在 do 循环中第一个括号顺序应该是无关紧要的。我们刷新变量值,但新值将在下一个循环或第二个括号中使用。
尝试(fib-iterat 2),
我们称旧状态为 (o1,o2,o3),
i=0≠n,
老 state:none,
新状态:(value0,value1,nextTerm)=(0,1,1),
我=我+1
i=1≠n,
旧状态:(0,1,1),
新状态:(o2,o3,o2+o3)=(1,1,1),
我=我+1
i=2=n,
旧状态:(1,1,1),
新状态:(o2,o3,o2+o3)=(1,1,2)
我们想要 (1,2,2) 所以它错了。
我觉得最重要的是不要以为是一套!捆绑。更像是这样。
(define (f n)
(do ([i 0 (+ i 1)]
[n1 1 (+ n1 n3)]
[n2 1 (+ n1 n2)]
[n3 1 (+ n2 n3)])
((= i n) (list n1 n2 n3))))
(define (my-do-loop n)
(local ((define (λ0 i n1 n2 n3) (+ i 1))
(define (λ1 i n1 n2 n3) (+ n1 n3))
(define (λ2 i n1 n2 n3) (+ n1 n2))
(define (λ3 i n1 n2 n3) (+ n2 n3))
(define (aux i n1 n2 n3)
(if (= i n)
(list n1 n2 n3)
(aux (λ0 i n1 n2 n3)
(λ1 i n1 n2 n3)
(λ2 i n1 n2 n3)
(λ3 i n1 n2 n3)))))
(aux 0 1 1 1)))
所以这让我们很容易理解为什么我们只使用旧值和绑定顺序并不重要,因为我们没有进行任何值绑定。
我是球拍的新手,我想给一个函数一个整数,它应该 return 它是斐波那契值(迭代)。我不知道我做错了什么,如果我加入一个 if 语句来捕捉数字 = 1 时一切都会中断
(define (fib-iterat n)
(do ((i 1 (+ i 1))
(nextTerm 0 (+ value0 value1))
(value0 0 (+ value1 0))
(value1 1 (+ nextTerm 0)))
((> i n) nextTerm))
)
我得到:
1 = 1
2 = 1
6 = 3
9 = 7
12 = 16
;;; correct
(define (fib n)
(do ((i 0 (+ i 1))
(n1 1 (+ n0 n1))
(n0 0 n1))
((= i n) n0)))
;;; still correct
(define (fib n)
(do ((i 0 (+ i 1))
(n0 0 n1)
(n1 1 (+ n0 n1)))
((= i n) n0)))
;;; wrong
(define (fib-iterat n)
(do ((i 0 (+ i 1))
(value1 1 nextTerm)
(value0 0 value1)
(nextTerm 1 (+ value0 value1))) ; first bracket close
((= i n) (list value0 value1 nextTerm)))) ; second bracket
我从未读过任何"do loop"代码(但应该很容易理解)。你可以这样想。我们将旧状态和新状态分开。在第一个括号中,变量微积分仅使用旧状态值。所以在很多情况下,在 do 循环中第一个括号顺序应该是无关紧要的。我们刷新变量值,但新值将在下一个循环或第二个括号中使用。
尝试(fib-iterat 2), 我们称旧状态为 (o1,o2,o3), i=0≠n, 老 state:none, 新状态:(value0,value1,nextTerm)=(0,1,1), 我=我+1
i=1≠n, 旧状态:(0,1,1), 新状态:(o2,o3,o2+o3)=(1,1,1), 我=我+1
i=2=n, 旧状态:(1,1,1), 新状态:(o2,o3,o2+o3)=(1,1,2) 我们想要 (1,2,2) 所以它错了。
我觉得最重要的是不要以为是一套!捆绑。更像是这样。
(define (f n)
(do ([i 0 (+ i 1)]
[n1 1 (+ n1 n3)]
[n2 1 (+ n1 n2)]
[n3 1 (+ n2 n3)])
((= i n) (list n1 n2 n3))))
(define (my-do-loop n)
(local ((define (λ0 i n1 n2 n3) (+ i 1))
(define (λ1 i n1 n2 n3) (+ n1 n3))
(define (λ2 i n1 n2 n3) (+ n1 n2))
(define (λ3 i n1 n2 n3) (+ n2 n3))
(define (aux i n1 n2 n3)
(if (= i n)
(list n1 n2 n3)
(aux (λ0 i n1 n2 n3)
(λ1 i n1 n2 n3)
(λ2 i n1 n2 n3)
(λ3 i n1 n2 n3)))))
(aux 0 1 1 1)))
所以这让我们很容易理解为什么我们只使用旧值和绑定顺序并不重要,因为我们没有进行任何值绑定。