递归就是在函数中调用本身这个函数。
写出递归最主要的是列出递归公式
我们先来看一个简单的问题
求n的阶乘
我们可以列出递归公式
当n=1时,函数的结果(返回值)等于1;于是就可以很快的写出递推公式了。
int jiecheng(int n)
{
if (n = 1) return 1;
else
return jiecheng(n - 1) * n;
}
斐波那契数列
指的是这样一个数列:1,1,2,3,5,8,13,21,34,55,89...
这个数列从第3项开始,每一项都等于前两项之和。
求写出这个数列的第n项。
写出递归最主要的是列出递归公式
我们可以很清楚的得到,当n=1或者2时,函数的结果(返回值)等于1;于是就可以很快的写出递推公式了。
int fbnc(int n)
{
int a = 0;
if (n == 1)
return 1;
if (n == 2)
return 1;
else
return fbnc(n - 1) + fbnc(n - 2);
}
汉诺塔问题
给定三根柱子,记为 A,B,C ,其中 A 柱子上有 N 个盘子,从上到下编号为 0 到 N−1 ,且上面的盘子一定比下面的盘子小。问:将 A 柱上的盘子经由 B 柱移动到 C 柱最少需要多少次?
移动时应注意:
① 一次只能移动一个盘子
②大的盘子不能压在小盘子上
假设总共需要移动n个盘子
1.将A柱上的n-1个盘子借助C柱移向B柱
2.将A柱上仅剩的最后一个盘子移向C柱
3.将B柱上的n-1个盘子借助A柱移向C柱
我们一样列出递推公式
当我们移动一次,将移动的字符进行打印,可以设置一个全局变量移动一次后将变量+1,可以计算出要的步数;
int x = 0;
void hanuo(int n,char a,char b,char c)
{
if (n == 1) x += 1,printf("%c->%c ", a, c);
else
{
hanuo(n - 1, a, c, b);
x += 1, printf("%c->%c ", a, c);
hanuo(n - 1, b, a, c);
}
}
代码就实现啦!!!