В упражнении вам предлагается написать две функции, одна из которых вычисляет f
"с помощью рекурсивного процесса", а другая - f
"с помощью итеративного процесса". Вы сделали рекурсивный. Поскольку эта функция очень похожа на функцию fib
, приведенную в примерах раздела, с которым вы связаны, вы сможете понять это, посмотрев рекурсивные и итерационные примеры функции fib
:
; Recursive
(define (fib n)
(cond ((= n 0) 0)
((= n 1) 1)
(else (+ (fib (- n 1))
(fib (- n 2))))))
; Iterative
(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))))
В этом случае вы должны определить функцию f-iter
, которая будет принимать аргументы a
, b
и c
, а также аргумент count
.
Вот функция f-iter
. Обратите внимание на сходство с fib-iter
:
(define (f-iter a b c count)
(if (= count 0)
c
(f-iter (+ a (* 2 b) (* 3 c)) a b (- count 1))))
И с помощью небольшого метода проб и ошибок я обнаружил, что a
, b
и c
должны быть инициализированы соответственно 2
, 1
и 0
, что также следует шаблону функция fib
инициализирует a
и b
до 1
и 0
. Так что f
выглядит так:
(define (f n)
(f-iter 2 1 0 n))
Примечание: f-iter
все еще является рекурсивной функцией , но из-за того, как работает Схема, она работает как итерационный процесс и выполняется в O(n)
времени и O(1)
пространство, в отличие от вашего кода, который является не только рекурсивной функцией, но и рекурсивным процессом. Я считаю, что это то, что искал автор Упражнения 1.1.