定义迭代求幂和斐波纳契程序

时间:2013-10-31 23:04:59

标签: lisp scheme racket iteration

我试图定义两个函数expo-iterfibonacci-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)

1 个答案:

答案 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过程,这应该不会太困难。请注意,辅助函数中有两个额外值,而不仅仅是一个。