zoukankan      html  css  js  c++  java
  • SICP学习笔记(P27P28)

    练习1.11

            函数f如下定义: 如果n<3, 那么f(n)=n; 否则f(n)=f(n-1)+2*f(n-2)*3*f(n-3). 写出一个递归和一个迭代求这个问题.

            递归:

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

            迭代:

    (define (f n)
      (if (< n 3)
          n
          (f-iter 2 1 0 n)))
    (define (f-iter a b c count)
      (if ( = count 2)
          a
          (f-iter (+ a (* 2 b) (* 3 c)) a b (- count 1))))

    练习1.12

            写一个pascal函数, 输入行和列, 求帕斯卡三角形中这个行和列的值.

            答案非常巧妙的把帕斯卡三角形放到了一个表格中. 表格中每一行的第一个数从表格的第一列开始, 那么求第row行第col列就可以非常形象描述成求第row-1行col列和row-1行和col列的和, 而这种方法最好的地方在于它表示每一行第一个数和最后一个数是1.

    (define (pascal row col)
      (cond ((= row 1) 1) ;第一行值为1
            ((= row col) 1) ;行和列相同的项值为1
            ((= col 1) 1) ;第一列值都为1
            (else (+ (pascal (- row 1) col)
                     (pascal (- row 1) (- col 1))))))

    练习1.13

            证明斐波那契数列第n个数Fib(n)是最接近Φn/根号5的整数,其中Φ=(1+根号5)/2.

            这题是看的答案, 证明过程也非常的直观明了.

    设fi = (1+根号5)/2, psi = (1-根号5)/2

    第一步目的要证明Fib(n) = (fin - psin)/根号5, 采用数学归纳法:

    当n=0时, Fib(0) = (fi0 - psi0)/根号5 = 0, 成立

    当n=1时, Fib(1) = (fi1 – psi1)/根号5 = 1, 成立

    推广到n时, Fib(n) = Fib(n-1) + Fib(n-2) = (fin-1 – psin-1 + fin-2 – psin-2)/根号5

                            = ((fi + 1)fin-2 – (psi +1)psin-2)/根号5    , 式1

                   因为fi2 = fi + 1, psi2 = psi + 1

                   所以式1= (fin - psin)/根号5, 即可证明第一步的式子.

    当n趋向于无穷大的时候, 因为psi=-0.618, 所以psin趋向于0, 即可得证Fib(n)是最接近Φn/根号5的整数.

  • 相关阅读:
    测试计划设计
    测试方案
    使用gulp构建自动化工作流
    ESLint--定制你的代码规则
    Node.js学习笔记(一):快速开始
    React-Native性能优化点
    ES6笔记(一):ES6所改良的javascript“缺陷”
    windows下React-native 环境搭建
    使用ssh连接gitHub
    javascript中的prototype和constructor
  • 原文地址:https://www.cnblogs.com/technology/p/1948755.html
Copyright © 2011-2022 走看看