递归函数典型应用

1.斐波那契数列

①思路:这个题首先我们得明白斐波那契数列。

斐波那契数列是一组第一位和第二位为1,从第三位开始,后一位是前两位和的一组递增数列

例如:1 1 2 3 5 8 13.......这样的数列。

观察上面的数列我们不难发现斐波那契数列第三项开始,每一项都等于前两项之和。

我们可以利用递归函数来实现它,把0和1当做这个递归的结束标志来完成这一系列操作

②代码实现:

#include<stdio.h>
int F(int x)
{
	if (x == 1 || x == 0)
		return x;
	else return (F(x - 1) + F(x - 2));
}//递归数列
int main()
{
	int a = 0;
	scanf_s("%d", &a);
	
	int b = F(a);
	printf("斐波那契数列的第%d个数为:%d\n", a, b);
	
	return 0;
}

2.求最大公约数和最小公倍数

①思路:首先我们需要明白什么是最大公约数还有最小公倍数,还有最大公约数的求法。

我个人运用了两个适合递归函数的方法来求这个最大公约数,分别是辗转相除法和不断相减法

辗转相除法:就是两个数相除然后余数跟最小的数相除,一直循环直到余数等于零,最后一次循环的除数就是最大公约数。就用30和18来举例子吧,

30÷18=1...12,18÷12=1...6, 12÷6=0

所以30和18的最大公约数为6。这里得余数我们可以很容易利用%来解决。

不断相减法:两数最大的数减去最小的,然后结果在跟上一次最小的数比大小,继续最大的减去最小的,直到两个数相减为0,得出结果。继续用30和18举例子,

30>18 30-18=12,18>12 18-12=6, 12>6 12-6=6 ,6=6 6-6=0

因此30和18的最大公约数为6,跟上面的结果是一样的。这里比大小我们可以利用三目运算符来实现。

②代码如下:

#include<stdio.h>
int zxgbs(int a, int b)
{
	int m = 0;
	m = a % b;
	return (m == 0) ? b : zxgbs(b, m);
}//最大公约数(辗转相除)
//int zxgbs(int a, int b)
//{
//	int t;
//	a = (a >= b) ? a : b;
//	b = (a >= b) ? b : a;//b最小值,a最大值
//	t = a - b;
//	return (t == 0) ? b : zxgbs(t, b);
//}//最大公约数(相减法)最大值减最小值然后递归
int main()
{
	int x, y;
	printf("请输入两个数:\n");
	scanf_s("%d %d", &x, &y);
	int z = zxgbs(x, y);
	printf("最大公约数为:%d\n 最小公倍数为:%d", z, (x * y) / z);
	return 0;
}

3.输入一个数求阶乘

①思路:这个题就比较简单了,一个数的阶乘,一个正整数的阶乘是所有小于及等于该数的正整数,并且0的阶乘为1。例如5!=5×4×3×2×1=120

我们可以用递归函数很容易实现它

②代码如下:

#include<stdio.h>
int tese(int x)
{
	
	if (x == 1 || x == 0)
		return 1;
	else return (tese(x - 1) * x);
}//阶乘
int main()
{
	int a = 0;
	scanf_s("%d", &a);
	int z = tese(a);
	printf("%d", z);
	return 0;
}

总结

以上是我最近学习递归函数发现的一些典型关于这这方面的题,做了这些题我们不难发现递归函数也是函数的一种,但是他的特殊点就在于可以一直调用一直调用,但是他必须要有一个结束语句来结束调用。每一次调用变量都会不同,并且每次调用结束都会返回。

Guess you like

Origin blog.csdn.net/weixin_64448174/article/details/122217057