函数递归的小案例

在数学运算中,会遇到计算多个连续自然数之间的和的情况。例如要计算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;
}
posted @ 2020-10-15 20:24  星卅  阅读(393)  评论(0)    收藏  举报