递归函数典型应用
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;
总结
以上是我最近学习递归函数发现的一些典型关于这这方面的题,做了这些题我们不难发现递归函数也是函数的一种,但是他的特殊点就在于可以一直调用一直调用,但是他必须要有一个结束语句来结束调用。每一次调用变量都会不同,并且每次调用结束都会返回。
以上是关于递归函数典型应用的主要内容,如果未能解决你的问题,请参考以下文章