Chinaunix首页 | 论坛 | 博客
  • 博客访问: 43685
  • 博文数量: 2
  • 博客积分: 1455
  • 博客等级: 上尉
  • 技术积分: 90
  • 用 户 组: 普通用户
  • 注册时间: 2006-01-15 21:31
文章分类

全部博文(2)

文章存档

2011年(2)

我的朋友
最近访客

分类:

2011-03-11 00:52:24

1.7 mysqrt的改进

改善精度控制的细节, 判断如果连续两次迭代的猜测值相差很小, 就退出. 实验表明达到效果了, 大数和小数都得到了很大改善.

美中不足是我还不会用变量, get-guess-result方法被重复调用了.

  1. (define (mysqrt x)
  2. (define default-guess 1.0)
  3. (define min-dx 0.000000001)
  4. (define (get-guess-result guess )
  5. (* guess guess))
  6. (define (improve guess )
  7. (/ (+ guess (/ x guess)) 2))
  8. (define (goodguess? guess old-gruess)
  9. (< (abs(- (/ (get-guess-result guess)
  10. old-gruess )
  11. 1))
  12. min-dx))
  13. (define (sqrt-itor guess old-gruess)
  14. (if (goodguess? guess old-gruess)
  15. guess
  16. (sqrt-itor (improve guess )
  17. (get-guess-result guess ))))
  18. (sqrt-itor default-guess x))

1.8 求立方根

求立方根实际上只需要替换improve函数和get-guess-result函数的实现, 其他代码相同. 我为了共享代码中的相同部分, 先重构了上面的代码, 做了一些抽象:

  1. (define (gen-entire-surd-fun n )
  2. ;entire2/entire3
  3. (define default-guess 1.0)
  4. (define min-dx 0.000000001)
  5. (define get-guess-result
  6. (cond ((= n 2)
  7. (lambda (guess )
  8. (* guess guess)))
  9. ((= n 3)
  10. (lambda (guess )
  11. (* guess guess guess )))))
  12. (define improve
  13. (cond ((= n 2)
  14. (lambda (guess x)
  15. (/ (+ guess (/ x guess)) 2)))
  16. ((= n 3)
  17. (lambda (guess x)
  18. (/ (+ (/ x (* guess guess))
  19. (* 2 guess)
  20. )
  21. 3)))))
  22. (define (goodguess? guess old-gruess)
  23. (< (abs(- (/ (get-guess-result guess)
  24. old-gruess )
  25. 1))
  26. min-dx))
  27. (define (entire-itor x guess old-gruess)
  28. (if (goodguess? guess old-gruess)
  29. guess
  30. (entire-itor x (improve guess x )
  31. (get-guess-result guess ))))
  32. (lambda (x) (entire-itor x default-guess x)))
  33. (define my-entire2 (gen-entire-surd-fun 2 ))
  34. (define my-entire3 (gen-entire-surd-fun 3 ))
  35. (write "hello, world, myentire sicp.1.8")
  36. ;(my-entire2 100000000000)
  37. ;(my-entire2 0.0000001)
  38. ;(my-entire3 100000000000)
  39. ;(my-entire3 0.0000001)

题外话, 熟悉了Lisp的写法, 感觉还是不错的, 简洁明了. 使用缩进能基本消除括号的烦恼. 进一步想, 如果直接使用缩进来控制代码结构, 那就变成Haskell和Python了. :D:D 但这样的风格似乎减弱了表达式求值的思想.

转载请注明:来自 
本文地址:

阅读(485) | 评论(1) | 转发(0) |
0

上一篇:SICP练习题 1.3~1.6

下一篇:没有了

给主人留下些什么吧!~~

dulao52011-03-11 01:01:22

杯具, 没有Lisp代码高亮不说, 还把缩进都丢了, 这样代码真难看啊