递归函数典型应用

Posted 小夏跑不死

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归函数典型应用相关的知识,希望对你有一定的参考价值。

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;

总结

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

以上是关于递归函数典型应用的主要内容,如果未能解决你的问题,请参考以下文章

关于闭包函数和递归函数的详细理解

数据结构第一节 递归

递归实现DFS全排列

JavaScript递归函数

python-递归函数

php递归遍历文件夹