• SICP 习题 (1.37)解题总结


    SICP 习题 1.37是一条非常长的题目,主要讲的是无穷连分式。无穷连分式对我来说又是一个陌生的概念,于是又去百度了一番,发现无穷连分式也是一个非常有意思的话题,涉及到无理数的表达。只是我建议大家还是临时不要深入思考它的数学含义,一旦開始思考可能你又会跳进数学的深渊中不可自拔。


    无穷连分式的形式例如以下:



    就像书中说到的,作为无穷连分式的一个特殊样例,假设N和D都为1的话,f= 1/ φ, 这点能够结合我们之前对黄金切割率的计算证明,这里就不多说了,并且,假设你不能从数学上理解它也无所谓,不影响我们做题目,我们越来越强大了,强大到能够忽略题干中得数学定义直接完毕习题。


    题目进一步讨论无穷连分式的计算,由于无穷连分式是无穷的,所以我们无法直接计算它的结果。为了计算一个无穷连分式的大概结果,简单的办法就是计算前面K个项,就像以下这样:




    这样我们就能够通过K 次计算完毕某个无穷连分式的计算,当然,计算的结果是一个约数,不是准确数字。


    题目要求我们完毕一个名为cont-frac的过程,这个过程接受3个參数,各自是n, d 和k,当中n表示无穷连分式的N部分,d表示无穷连分式的D部分,k代表取几个项进行计算。


    假设我们细致看无穷连分式的定义,就会发现这是一个非常典型的递归定义。对于我们定义的cont-frac的过程,基本上它要做的事情就是:(cont-frac n) = N(n) / (D(n) + contact-frac(n+1))


    除了上面的递归调用以外,cont-frac中还要完毕的就是对k的比較,确定什么时候结束递归调用,開始返回。


    我定义的递归计算步骤例如以下:

    (define (cont-frac n d k)
      (define (cont-frac-inner n d cur-k)
        (if (< cur-k k)
    	(/ (n cur-k) (+ (d cur-k) (cont-frac-inner n d (+ cur-k 1))))
    	(d cur-k)))
      (cont-frac-inner n d 1))

    反过来,实现的迭代计算步骤例如以下:

    (define (cont-frac-iter n d k)
      (define (cont-frac-iter-inner n d cur-k cur-value)
        (if (= cur-k k)
    	(cont-frac-iter-inner n d (- cur-k 1) (d cur-k))
    	(if (> cur-k 1)
    	    (cont-frac-iter-inner n d (- cur-k 1) (+ (d cur-k) (/ (n cur-k) cur-value)))
    	     (/ (n cur-k) cur-value))))
    
      (cont-frac-iter-inner n d k 0))


    接着,题目还要求我们用这个cont-frac来计算黄金切割率,这个比較简单,直接给n和d传递一个返回1的lambda过程就好了,我的測试方法例如以下:


    (define (Phi-test k)
      (cont-frac (lambda (i) 1.0)
    	     (lambda (i) 1.0)
    	     k))
    
    (define (Phi-test-iter k)
      (cont-frac-iter (lambda (i) 1.0)
    	     (lambda (i) 1.0)
    	     k))


    最后,题目中还要求我们确定k取值多少的时候能够计算出有4位精度的黄金切割率,这就非常easy了,多測试几个cont-frac的调用就好了。


  • 相关阅读:
    理解inode
    贝叶斯公式与拼写检查器
    《C程序设计语言》第四章 函数和程序结构
    MIT《计算机科学与编程导论》课堂笔记
    很牛的牛顿迭代法
    开发一个小工具重温C#经典问题
    斯坦福《编程方法学》环境搭建及常见问题
    看Sybase官方手册学索引工作原理
    学习编程的方法、软件和工具
    大师里奇留给了我们什么
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4184614.html
Copyright © 2020-2023  润新知