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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值