我试图定义两个函数expo-iter
和fibonacci-iter
,它们是指数函数和斐波那契函数的迭代版本。我理解如何做阶乘函数(见下文),但我没有得到这两个函数。对于expo-iter
,应该有两个变量(b
e
),对于fibonnaci-iter
,有一个变量(n
)。
(define factorial (lambda (n) (fact-iter 1 1 n)))
(define fact-iter
(lambda (product counter max)
(if (> counter max)
product
(fact-iter (* counter product) (+ counter 1) max))))
; (factorial 4)
; (fact-iter 1 1 4)
; (fact-iter 1 2 4)
; (fact-iter 2 3 4)
; (fact-iter 6 4 4)
; (fact-iter 25 5 4)
; (24)
答案 0 :(得分:1)
这里的指数可能更容易。首先,让我们考虑一下简单的递归解决方案。 x n 等于 x(x n-1 ),所以一个简单的递归解决方案
(define (expt x n)
(if (= n 0)
1
(* x (expt x (- n 1)))))
现在这不是尾递归,但你非常类似于递归因子的结构
(define (fact n)
(if (= n 0)
1
(* n (fact (- n 1)))))
并且您已经证明可以将其转换为使用尾递归和累加器的形式:
(define (fact n)
(let loop ((n n) (f 1))
(if (= n 0)
f
(loop (- n 1) (* f n)))))
在阶乘的情况下,辅助函数会随之传递“部分因子”。首先是n
,然后是n(n-1)
,然后是n(n-1)(n-2)
,依此类推,直到它最终为n(n-1)...1 = n!
。对于指数,您的累加器应该是“部分指数”,首先是 x ,然后是 x 2 ,然后是 x 3 直到它最终 x n 。
现在,阶乘和指数使用单个累加器的方法的原因是“部分结果”只能在一个值中捕获。在阶乘的情况下,它是“部分因子 n(n-1)...(nm)。在指数的情况下,它是 x m (其中 m< n )。
要计算斐波纳契数,您计算下一个值所需的部分结果实际上是值的对。要获得 n th Fibonacci数,您需要 n-1 th 和 n- 2 个 的。无论你是否考虑前两个Fibonacci数字0和1或1和1,计算第三个,你只需要考虑这两个。要计算第四个,您只需要记住第三个和第二个。要计算第五个,您只需要第四个和第三个。然后,迭代算法看起来像这样:
a = 0; ˚F<子> I-2 子>
b = 1; ˚F<子> I-1 子>
而n> 0
b = a + b; b现在是f i
a = b - a; a现在是f i-1 ,所以我们可以计算f i + 1
n = n - 1
结束时 返回b; b现在是f n
如果您很乐意将迭代过程转换为尾递归Scheme过程,这应该不会太困难。请注意,辅助函数中有两个额外值,而不仅仅是一个。