SICP学习笔记(4)

[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 n) (
  ; if (< n 3) 
        ; n
        ; ( + ( f (- n 1)) (* 2 (f (- n 2))) (* 3 (f (- n 3))))
; ))


(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));col = 1|col = r 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);

你可能感兴趣的:(SICP学习笔记(4))