函数递归的小案例
在数学运算中,会遇到计算多个连续自然数之间的和的情况。例如要计算1n之间自然数之和,就需要先计算1加2的结果,用这个结果加3再得到一个结果,用新得到的结果加4,以此类推,直到用1(n-1)之间所有数的和加n。
在程序开发中,要想完成上述功能,就需要使用函数的递归调用,所谓的递归调用就是函数内部调用自身的过程。需要注意的是,递归必须要求有结束条件,不然就会陷入无限递归的状态,永远无法结束调用。
故而函数递指函数可以调用自己,这就叫函数的递归。
以下是四个运用函数递归实现的数学运算及小游戏。
1-100的和
#include <stdio.h>
int func(int n)//递归调用:求1-100的和
{
if (n == 1)//n=1,func(1)=1;
{
return 1;
}
else
{
return n + func(n - 1);//n=2,func(2)=2+func(1)=3
} //n=3,func(3)=3+func(2)=6
}
int main()
{
printf("%d\n", func(100));
getchar();
return 0;
}
n的阶乘
#include <stdio.h>
int func(int n)//递归调用:求n的阶乘
{
if (n == 0)//递归调用最重要的是找到终止条件
return 1;//n=1时,func(1)=1*!0=1;n=2时,func(2)=2*!1=2;n=3时,func(3)=3*!2=6;
else
return n * func(n - 1);
}
int main()//递归算法
{
printf("%d\n", func(5));//求5的阶乘
getchar();
return 0;
}
斐波那契数列
#include <stdio.h>
int f(int n)
{//n表示第个数,即定义的是数据的位置
if (n == 1 || n == 2)//数列的第一项和第二项返回值为1
return 1;
else
return f(n - 1) + f(n - 2);//其余项的值为该值前两项的值之和
//f(3)=f(1)+f(2)
}
//斐波那契数列:1 1 2 3 5 8 13 21 34 55 89 ...
int main()
{
printf("%d\n", f(11));//输出第11个数据
getchar();
return 0;
}
汉诺塔游戏
#include <stdio.h>
void hnt(int n, char a, char b, char c)//n表示最后一个塔,即最底下的塔
//a,b,c分别代表起点,辅助,终点(看作是从左往右的三根柱子)
{
if (n == 1)
printf("%c---->%c\n", a, c);
//只有一个塔,直接从柱子a移动到柱子b;--->表示移动
else
{
/*有两个塔的移动步骤
printf("%c--->%c\n",a,b);
printf("%c--->%c\n",a,c);
printf("%c--->%c\n",b,c);
*/
hnt(n - 1, a, c, b);//把最后一个塔上面的所有塔看成一个整体,在a柱子上借助c柱子移动到b柱子
hnt(n - 1, b, a, c);//b柱子借助a柱子移动到c柱子
}
}
int main()
{
//hnt(1, 'a', 'b', 'c');n=1,一个塔
//hnt(2, 'a', 'b', 'c');n=2,两个塔
hnt(7, 'a', 'b', 'c');
getchar();
return 0;
}

浙公网安备 33010602011771号