递归:
链条:计算过程存在递归链条
基例: 存在一个或多个不需要再次递归的实例
简单的小例子:对于n!
例如当n=5 的时候
我们知道n=0时 n!=1,所以这个就是递归出口,我们定义一个fact(n)这个函数
def fact(n):
if n==0:
return 1
else return n*fact(n-1)
递归之汉诺塔:
规则:提供三根柱子,A、B、C,第一根柱子A上放着塔状的圆盘,经过中间柱子B到达目标柱子C,期间小圆盘只能放在大圆盘上面,并且每次只能移动一个圆盘。
步骤:我们将A柱子上的前n-1个柱子搬到B柱子,再将最后一个盘子从A搬运到C,再将前n-1个柱子从B搬运到A,即实现了从第一个圆盘A到C的操作。
我们将n个圆盘化简为n-1,对于递归,我们只关心递归链条,即如何将n拆成n-1之间的关系,所以对n-1如何操作并不用关心它。
#include <bits/stdc++.h>
using namespace std;
void hanio(int n,char src, char dst, char mid);//分别是圆盘个数,source , destination mid
int cnt=0;//步数
int main()
{
int number;//圆盘个数
scanf("%d",&number);
char A='A',B='B',C='C';
hanio(number,A,C,B);
printf("%d",cnt);
return 0;
}
void hanio(int n,char src,char dst,char mid){
if(n==1){
printf("%d: %c -> %c\n",1,src,dst);
cnt++;
}
else{
hanio(n-1,src,mid,dst);//将前n-1个由src这个柱子通过中间柱子dst移动到目标柱子mid上
printf("%d: %c -> %c\n",n,src,dst);//将第n个圆盘从src这个柱子移动到dst这个柱子上
cnt++;//printf一次说明搬了一次
hanio(n-1,mid,dst,src);//再将前n-1个由mid通过中间柱子src移动到dst目标柱子上
}
}