递归算法的证明与设计
来源:互联网 发布:软件开发技术基础 pdf 编辑:程序博客网 时间:2024/04/30 03:18
主1:关于递归算的证明是证明算法的正确性。
证明所需工具:数学归纳法。
证明分为两个步骤:
1、证明该算法对于任意有意义的输入都可以返回。
2、证明该算法对于任意有意义的输入它的返回都是正确的。
总结,对于任意有意义的输入都可以返回正确的结果。
例子:Hanoi(汉诺)塔问题:
void hanoi(int n,char s,char t,char d) // s=source t=temporary d=destination{ if(1 == n) // 程序段一 { printf("%c -> %c\n",s,d); // move s to d } else // 程序段二 { hanoi(n-1,s,d,t); printf("%c -> %c\n",s,d); // move s to d hanoi(n-1,t,s,d); }}hanoi(n,'1','2','3'); // 初始调用对于初始调用第2、3、4参数都是固定的,因此我们只对第一个参数n进行归纳。
第一步:
当 n = 1 时,该函数进入程序段一,打印 1 -> 3 后就返回了,因此该函数可以返回。
假设:当 n = k-1 >= 1 时该函数可以返回。
当n = k时,初始调用进入程序段二(n显然大于1)
调用hanoi(k-1,s,d,t),根据假设该函数可以返回,
打印一段话,
调用hanoi(k-1,t,s,d),根据假设该函数可以返回,
最终返回。
因此根据初始条件和归纳该函数对于任意有意义的输入都可以返回。
第二步:
当 n = 1 时,该函数进入程序段一,打印 1 -> 3 ,然后直接返回了,因此该函数显然正确。
假设:当 n = k - 1 >= 1 时该函数可以返回正确的结果。
当 n = k 时,初始调用进入程序段二
调用hanoi(k-1,s,d,t),根据假设该函数可以返回正确的结果,即它可以将柱子s(初始调用的s = ‘1’)上k-1个 盘子借助柱子d移动到柱子t上,
此时柱子s上只有一个盘子了(且是那个最大的盘子),且d上没有盘子,因此可以将柱子s上的那个盘子移动到柱子d上(printf("%c -> %c\n",s,d); )。
调用hanoi(k-1,t,s,d),根据假设该函数可以返回正确的结果,即它可以将柱子t上的k-1个盘子借助柱子s移动到柱子d上,
至此,所有的盘子已经从柱子s移动到柱子d上了。
总结:该函数对于任意有意义的输入都可以返回正确的结果。
证毕!
设计阶段:
……
- 递归算法的证明与设计
- 算法分析与设计-01-Fibonacci数列的递归算法
- 算法分析与设计-02-勒让德多项式的递归算法
- 算法设计与分析 Ackerman函数的递归实现算法
- 算法设计与分析 全排列的递归实现算法
- 算法设计与分析 整数划分的递归实现算法
- 算法设计与分析 合并排序的递归实现算法
- 算法设计与分析 快速排序的递归实现算法
- 扩展欧几里得算法的非递归实现的证明
- 递归的证明方法
- 算法设计方法:递归的内涵与经典应用
- 【算法设计-二叉树遍历】二叉树的递归与非递归遍历方法
- 算法设计与分析:第二章 递归 2.6基于递归的插入排序
- 算法学习笔记----递归式证明
- java、装饰设计模式与递归算法
- 递归与非递归算法的分析
- Ackerman的递归与非递归算法
- 递归与非递归的算法效率
- 转换textarea换行符终极解决办法(兼容所有浏览器)
- pkg-config工具, ld.so.conf文件, PKG_CONFIG_PATH环境变量
- 项目流程
- Windows 杀端口方法
- java.lang.OutOfMemoryError处理错误
- 递归算法的证明与设计
- 16_4(2)指来指去
- java的第一个程序 ----Hello World
- Universal iOS App还是iPhone App + “HD”?
- 如何提升Servlet和JSP应用程序的效率
- DOS命令大全(经典收藏)
- RSAUtil.java类
- curl教程
- ext radiogroup 去掉白色背景色