摘要:我们把一个直接调用自己或通过一系列的调用语句间接地调用自己的函数,称作递归函数。
一、累加求和的递归实现
1.核心函数
当所计算的数大于0时,一直递归调用函数,直到值小于0时返回0然后结束
int addTo(int paraN)
{
int tempSum;
if(paraN<=0)
{
return 0;
}else{
tempSum=addTo(paraN-1)+paraN;
return tempSum;
}
}
2.完整代码实现
#include<stdio.h>
int addTo(int paraN)
{
int tempSum;
if(paraN<=0)
{
return 0;
}else{
tempSum=addTo(paraN-1)+paraN;
return tempSum;
}
}
void addToTest()
{
int n,sum;
printf("\r\n---Begin!---\r\n");
n=6;
sum=addTo(n);
printf("\r\n0 adds to %d gets %d.\r\n",n,sum);
n=1;
sum=addTo(n);
printf("\r\n0 adds to %d gets %d.\r\n",n,sum);
n=-1;
sum=addTo(n);
printf("\r\n0 adds to %d gets %d.\r\n",n,sum);
printf("\r\n---End!---\r\n");
}
int main()
{
addToTest();
return 0;
}
3.样例输出
—Begin!—
0 adds to 6 gets 21.
0 adds to 1 gets 1.
0 adds to -1 gets 0. —End!—
二、汉诺塔问题
1.解题思路
当我们想将64个圆盘从A柱移动到B柱上,我们可以将其分为三个步骤: 1、通过一种符合要求的方式将A柱上63个圆盘从A移动到C 2、经过步骤1之后A柱上只剩下一个圆盘,我们将这个圆盘从A移动到B 3、经过步骤1和步骤2之后,C柱上有了63个圆盘,B上有1个圆盘,我们再通过某种方式将C柱上63个圆盘从C移动到B 经过了步骤1、 2 、3之后,我们就将所有的圆盘从A移动到了B 1 plates:A -> B 2 plates:A -> C A -> B C -> B 3 plates:A -> B A -> C B -> C A -> B C -> A C -> B A -> B n plates:前n-1个移到C,第n个移到B,再将n-1个移到B
2.核心函数的实现
void hanoi(int paraN,char paraSource,char paraDestination,char paraTransit)
{
if(paraN<=0)
{
return ;
}else{
hanoi(paraN-1,paraSource,paraTransit,paraDestination);
printf("%c -> %c \r\n",paraSource,paraDestination);
hanoi(paraN-1,paraTransit,paraDestination,paraSource);
}
}
3.完整代码实现
#include<stdio.h>
void hanoi(int paraN,char paraSource,char paraDestination,char paraTransit)
{
if(paraN<=0)
{
return ;
}else{
hanoi(paraN-1,paraSource,paraTransit,paraDestination);
printf("%c -> %c \r\n",paraSource,paraDestination);
hanoi(paraN-1,paraTransit,paraDestination,paraSource);
}
}
void hanoiTest()
{
printf("---Begin!---\r\n");
printf("1 plates\r\n");
hanoi(1,'A','B','C');
printf("2 plates\r\n");
hanoi(2,'A','B','C');
printf("3 plates\r\n");
hanoi(3,'A','B','C');
printf("5 plates\r\n");
hanoi(5,'A','B','C');
printf("---End!---\r\n");
}
int main()
{
hanoiTest();
return 0;
}
3.样例输出
—Begin!— 1 plates A -> B 2 plates A -> C A -> B C -> B 3 plates A -> B A -> C B -> C A -> B C -> A C -> B A -> B 5 plates A -> B A -> C B -> C A -> B C -> A C -> B A -> B A -> C B -> C B -> A C -> A B -> C A -> B A -> C B -> C A -> B C -> A C -> B A -> B C -> A B -> C B -> A C -> A C -> B A -> B A -> C B -> C A -> B C -> A C -> B A -> B —End!—
三、写在最后
关于递归算法,也只有计算机才喜欢,递归函数给我的感觉就是虽然看着代码很简洁,字数也不多,但真要深入理解它的具体过程也是很费脑细胞的,不过递归确实有数学上的简洁美和逻辑美。
|