汉诺塔问题(以及递归的个人理解)
2018-10-01 22:14
183 查看
#include <stdio.h> int i=0; void move(int n,char a,char b){ printf("move %d from %c to %c\n",n,a,b); i++; } void hanoi(int n,char a,char b,char c){ if(n==1) move(1,a,c); else { hanoi(n-1,a,c,b); move(n,a,c); hanoi(n-1,b,a,c); } } int main(){ hanoi(5,'a','b','c'); printf("%d",i); return 0; }
所写hanio()方法的作用是使一堆 从一个柱子移到另一个柱子(过程中需要一个辅助柱)
问题核心:假设从上到下是第1-n个 , 最后几步一定是把第n个上的n-1个从A移到B, 然后把 第n个从A移到C ,然后把B的n-1个从B移到C(移动一堆时均要辅助柱子),问题出口为一个盘子时从A移到C(个人感觉类似科学计数法)
递归:
使用条件:重复相似的过程,将复杂问题化为子问题求解
无法解决->存入栈中->还无法解决->继续存入栈中->……直到能够解决逆向一步一步返回数据 还原场景
递归 每一次都转化为子问题,向递归出口靠近
个人理解:类似于科学计数法 最简单的条件成立 然后一般条件成立(n=1递归过程成立 n=x 递归过程仍成立)
递归中函数如何入栈出栈:
个人理解:main函数进入子函数 , 子函数再进入子函数, 子函数进入子子函数之前 都要把返回地址 和参数 保存 ,然后转入子函数 ,直到不再调用就把值传回
相关文章推荐
- 深入理解递归以及汉诺塔问题[数据结构]
- 深入理解汉诺塔问题与递归
- 通过汉诺塔问题来理解递归
- 使用redis缓存数据需要注意的问题以及个人的一些思考和理解
- 汉诺塔问题(递归)理解
- ~ 使用redis缓存数据需要注意的问题以及个人的一些思考和理解
- 北大 算法 2.4 递归 汉诺塔问题手工解法以及编译过程
- 2.1递归概念 - 对排序问题、整数划分问题、汉诺塔问题的理解
- 用递归求解全排列问题(个人理解)
- 递归的定义以及递归的示例(计算阶乘、计算斐波那契数、递归二分查找、回文串递归方法解决、汉诺塔问题、递归选择排序问题)
- 汉诺塔递归问题的理解
- 使用redis缓存数据需要注意的问题以及个人的一些思考和理解
- 汉诺塔问题以及递归
- 汉诺塔问题个人理解
- 通过汉诺塔问题理解递归的精髓
- STL,sort排序,栈和递归,以及汉诺塔问题
- 使用redis缓存数据需要注意的问题以及个人的一些思考和理解
- 对汉诺塔_递归问题的新理解
- java数据结构与算法-递归解决汉诺塔问题
- 汉诺塔问题 递归