计算机问题求解

2016-12-30  本文已影响171人  瀚苑小黄猫

程序开发过程


一个简单例子


虽然一个问题的说明性描述与其操作性描述表达的是同一个问题,但它们却非常不同。前者说明了需要解决的问题是什么,针对什么样的问题,期望什么样的解;而后者说明通过怎样的操作过程可以得到所要的解。

如:求出任一个非负实数的平方根(牛顿迭代法)。

算法描述


  1. 对给定正实数 x 和允许误差 e ,令变量 y 取任意正实数值,如令 y=x
  2. 如果 y*yx 足够接近,即 |y*y-x| < e ,计算结束并把 y 作为结果;
  3. z=(y+x/y)/2 ;
  4. z 作为 y 的新值,回到步骤 1 。

Python 程序实现


def sqrt(x):
    y = 1.0
    while abs(y * y - x) > 1e-6:
        y = (y + x/y) / 2
    return y

其中,变量 y 初值为 1.0,允许误差为 10-6。通过各种数值测试,可以看到这个函数确实能完成所需要的工作。

总结


在上述例子中,最不清晰的是从平方根的定义到求平方根的算法。然而 ......

算法设计是一种创造性工作,依赖于对问题的认识和相关领域的知识,没有放之四海而皆准的路径可循。

摘自北大裘宗燕老师《数据结构与算法》

上一篇 下一篇

猜你喜欢

热点阅读