V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Zeahoo
V2EX  ›  编程

我这个开立方的 scheme 代码哪里有错。

  •  
  •   Zeahoo · 2016-10-24 10:06:16 +08:00 · 2811 次点击
    这是一个创建于 2986 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在看 SICP 这本书,做到练习 1.8 的时候,Newton method 实现的代码如下:

    (define (cubrt-iter guess x)
      (if (good-enough? guess x)
          guess
          (cubrt-iter (improve guess x)
    		 x)))
    
    (define (improve guess x)
      (third guess (/ x guess)))
    
    (define (third x y)
      (/ (+ (/ x (* y y))
    	(* 2 y))
         3))
    
    (define (good-enough? guess x)
      (< (abs (- (cube guess) x)) 0.001))
    
    (define (cube x) (* x x x))
    (define (abs x)
      (cond ((> x 0) x)
            ((= x 0) 0)
            ((< x 0) (- x)))
      )
    
    (define (cubrt x)
      (cubrt-iter 1.0 x))
    
    

    使用牛顿公式做开立方,但是不知道为什么执行的时候没有结果,大家帮我看下原因吧 :(

    第 1 条附言  ·  2016-10-24 11:09:05 +08:00

    贴已经解决了,third里面的参数搞反了,正式代码解决如下:

    (define (cubrt-iter guess x)
      (if (good-enough? guess x)
          guess
          (cubrt-iter (improve guess x)
    		 x)))
    
    (define (improve guess x)
      (/ (+ (/ x (* guess guess))
    	(* 2 guess))
         3))
    
    (define (good-enough? guess x)
      (< (abs (- (cube guess) x)) 0.001))
    
    (define (cube x) (* x x x))
    
    (define (abs x)
      (cond ((> x 0) x)
            ((= x 0) 0)
            ((< x 0) (- x)))
      )
    
    (define (cubrt x)
      (cubrt-iter 1.0 x))
    
    
    3 条回复    2016-10-24 11:02:47 +08:00
    tan90ds
        1
    tan90ds  
       2016-10-24 10:22:53 +08:00
    你的 improve 函数和 third 函数有点怪,没仔细看但是感觉不像是正确的牛顿迭代法。
    Zeahoo
        2
    Zeahoo  
    OP
       2016-10-24 11:01:59 +08:00
    Zeahoo
        3
    Zeahoo  
    OP
       2016-10-24 11:02:47 +08:00
    @tan90ds 一脸蒙蔽,终于知道原因了, third 里面 x 和 y 的参数搞反了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3877 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 05:11 · PVG 13:11 · LAX 21:11 · JFK 00:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.