Последовательность Фибоначчи итеративно? - PullRequest
1 голос
/ 20 сентября 2019

Я новичок в ракетке и пытаюсь дать функции целое число, и она должна вернуть значение Фибоначчи (итеративно).Я не знаю, что я делаю не так с делом, и если я включаю оператор 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

1 Ответ

2 голосов
/ 20 сентября 2019
;;; 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), так что это неправильно.

...