将递归函数定义为迭代函数?

时间:2014-12-30 00:07:54

标签: recursion scheme lisp

我有以下需要在Scheme

中转换为迭代的递归函数
(define (f n)
  (if (< n 3) n 
    (+ 
      (f (- n 1))
      (* 2 (f(- n 2)))
      (* 3 (f(- n 3)))
      )
    ))

我的问题是我很难将其转换为迭代(即使递归具有线性执行时间)。我认为没办法做到这一点,因为我无法弄清楚如何做到这一点。

该功能定义如下:

f(n) = n if n<3 else f(n-1) + 2f(n-2) + 3f(n-3)

我试图将其计算为5线性,如此

1 + 2 + f(3) + f(4) + f(5)

但是为了计算说f(5),我需要回顾f(4), f(3), f(2)f(4)我必须重新推荐f(3), f(2), f(1)

这是SICP书中的一个问题。

1 个答案:

答案 0 :(得分:1)

在书中,作者有一个例子,用于计算计算斐波那契数的迭代过程。

(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))))

这里的要点是在计算过程中使用两个参数a和b来记忆f(n + 1)和f(n)。类似的可以应用:我们需要a,b,c来记忆f(n + 2),f(n + 1)和f(n)

;; an interative process implementation                                                                                                                       
(define (f-i n)                                                                                                                                               
  ;; f2 is f(n+2), f1 is f(n+1), f0 is f(n)                                                                                                                   
  (define (interative-f f2 f1 f0 count)                                                                                                                       
    (cond                                                                                                                                                     
      ((= count 0) f0)                                                                                                                                         
      (else (interative-f                                                                                                                                      
              (+ f2 (* f1 2) (* f0 3))                                                                                                                          
              f2                                                                                                                                                
              f1                                                                                                                                                
              (- count 1)))))                                                                                                                                   
  (interative-f 2 1 0 n))