递归的概念:
递归是一种通过调用自身来解决问题的方法,即在函数体里调用自己。通过递归,问题会被划分成规模较小的子问题,递归地解决这些子问题,最终得到原始问题的解。
-
明确函数的功能,知道函数要干什么
-
找到递归结束条件,通过递归将问题分解,逐步缩小范围,直到最终分解至直接可解
-
找出函数的等价关系式,即如何分解问题,如何缩小范围,下一个状态如当前状态的关系
边界条件和递归方程是递归的两大要素,当一个问题明显能分解为多个子问题,并且问题的解决方法相同,子问题也还能分解为子问题...可以考虑使用递归。不过,使用递归时,也要小心如果递归的深度过深很可能会因此爆栈,而导致程序挂掉。
递归是一种解决问题的思想,利用递归解决问题一定一定一定要在宏观上明确函数的功能,将其与功能的具体代码实现要自己能分别开来。
hanoi
汉诺塔
思路分析
求n个盘子完成要求的步数或步骤;假如有n个盘子,如果想将这n个盘子从一个柱子上转移到另一个柱子上,那么就需要借助第三根柱子:我们先将起始棍上边的 n-1 个盘子借助目标棍转移到第三方棍,然后将最后一个盘子从起始棍移动到目标棍,最后将第三方棍上的 n-1 个盘子从第三方棍借助起始棍移动到目标棍。由此我们可以看成:既然移动 n 个盘子分为了三步,那么在我们移动 n-1个盘子时也可以考虑上述三个步骤......当盘子数为1时,我们直接就能移动盘子了。既然盘子数为1时解决了,那么显而易见我们就能知道盘子数为2也就解决了,继而当盘子数为3,4,5...n-1,n时,也就因为盘子数为1时问题得到解决带来的蝴蝶效应而得以解决。这个过程就可以通过递归实现。
取名ABC只是为了区分三根棍子,在每一轮中只有 起始棍 目标棍 和 第三方棍。
Hanoi代码
#include<iostream>
using namespace std;
void move(char x,char y);
void hanoi(int n,char one,char two,char three);
int i=0;
int main()
{
int m;
cout<<"输入盘子数:";
cin>>m;;
hanoi(m,'A','B','C');
}
void hanoi(int n,char one,char two,char three)
{
if (n == 1)
{
move(one,three);
}
else
{
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
}
void move(char x, char y)
{
cout<<x<<"-->"<<y<<" "<<++i<<endl;
}