;;; 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 первый порядок скобок во многих случаях не имеет значения.Мы обновляем значение переменной, но новые значения будут использоваться в следующем цикле или второй скобке.
try (fib-iterat 2), мы называем старое состояние (o1, o2, o3), i = 0 ≠ n, oldсостояние: нет, новое состояние: (значение0, значение1, следующий срок) = (0,1,1), i = i + 1
i = 1 ≠ n, старое состояние: (0,1,1), новое состояние: (o2, o3, o2 + o3) = (1,1,1), i = i + 1
i = 2 = n, старое состояние: (1,1,1),новое состояние: (o2, o3, o2 + o3) = (1,1,2) мы хотим (1,2,2), так что это неправильно.