程序调用自身的编程技巧叫做递归,所以递归问题可以看做是阶层问题,整个问题可以看做是f(n)
递归有三个要点:
1,将问题转化为一个阶层为N的问题。
2,阶层为N的问题能转化为解决方法相同但规模小于N的问题,即f(n-1)。
3,递归的出口,即结束的条件。
下面用递归的方法来解决几个问题
//打印整形数字,因为数字是反序生成的,低位数字先于高位数字生成,所以必须反次序打印
void printd(int n)
{
if(n<0)
{
putchar('-');
n=-n;
}
if (n/10)
{
printd(n/10);
}
putchar(n%10+'0');
}
//斐波那契数列问题
int fibonacci(int n)
{
if (n==1||n==2)
{
return 1;
}
else
{
return fibonacci(n-1)+fibonacci(n-2);
}
}
//hanoo塔问题,公式hanoi(n)=2*hanoi(n-1)+1(放到“缓存“盘一次,放到目标盘一次再加上放最大盘放到目标盘)
int hanoi(int n)
{
if (n==1)
{
return 1;
}
else
{
return 2*hanoi(n-1)+1;
}
}
//上阶梯问题,有n级的阶梯,一次可以上1级或者2级,求有多少种方法
int jump(n)
{
if (n==1)
{
return 1;
}
else if (n==2)
{
return 2;
}
else
{
return jump(n-1)+jump(n-2);
}
}