练习1.11

递归版本:

(define (recur-f n)
    (if (< n 3) n
        (+ (recur-f (- n 1))
           (* 2 (recur-f (- n 2)))
           (* 3 (recur-f (- n 3))))))

这个很好写 只要按照定义翻译一遍就行 当然效率也很低

迭代版本:

(define (iter-f n)
    (define (iter x y z count)
        (if (= count 0)
            z
            (iter (+ x (* 2 y) (* 3 z))
                  x
                  y
                  (- count 1))))
    (iter 2 1 0 n))

这个就稍微有点难度了

用了以下代换:

xx+2y+3zyxzy \begin{array}{ll} x\leftarrow{x+2y+3z}\\ y\leftarrow{x}\\ z\leftarrow{y} \end{array}

这是一个线性迭代过程 时间复杂度为O(n) 比递归版本的好很多


更多有关自底向上计算的知识请参阅Dynamic Programming

results matching ""

    No results matching ""