[1]树型递归就是典型的fib数列,然后转换为迭代的尾递归形式.可以大大增加效率.
练习1.11,f(n) = f(n-1)+2f(n-2)+3(n-3) (n>=3)
f(n) = n (n<3),用两种方式求f(n)
(define (f_iter f_n1 f_n2 f_n3 count) (
if (= count 0 )
f_n1
(f_iter (+ f_n1 (* 2 f_n2 ) (* 3 f_n3) ) (* 2 f_n1 ) (* 3 f_n2) (- count 1 ) )
) )
(define (F n) (
if(< n 3 )
n
(f_iter 4 2 1 (- n 3 ) ) ) )
用shceme写递归比起python和c++确实不好写。。。但是也要求我们对变量的变换把握的更精确.
练习1,12:计算pascal三角(杨辉三角)的内部元素.
(define (Pascal row col) (
if (or (= col 1 ) (= col row) )
1
(+ (Pascal (- row 1 ) (- col 1 ) ) (Pascal (- row 1 ) col) )
) )
还可以利用迭代的代码来做,利用pascal三角另外的公式可以轻易算出来具体位置的元素.
同时注意scheme不能对一个常量用()括起来….。
练习1.15,利用三角恒等式 sinx = 3sinx/3 - 4(sinx/3)^3和sinx近似x(x小于0.1)来计算sinx.
题目给出的代码还是使用了尾递归来计算的,p(sin (/ x 3)),每一次都先调用sin(),最后在返回的时候调用p()
对这个算法的复杂度分析较为简单,只需要看到log(3)(x*10)次以后这个递归就进入了终止阶段。所以空间和时间复杂度都是(logx);