✨✨✨学习的道路很枯燥,希望我们能并肩走下来!
编程真是一件很奇妙的东西。你只是浅尝辄止,那么只会觉得枯燥乏味,像对待任务似的应付它。但你如果深入探索,就会发现其中的奇妙,了解许多所不知道的原理。知识的力量让你沉醉,甘愿深陷其中并发现宝藏。
前言
本篇通过三道练习题了解函数递归,实现函数递归的简单运用,如有错误,请在评论区指正,让我们共同进步! |
本文开始
1.求阶乘
如何实现递归求阶乘呢?我们先用非递归的方式求出阶乘,通过观察思考递归方式怎么求吧!
1.1非递归求阶乘
题目:输入一个数n,求出n的阶乘
输入:3
输出:6
[注] n! =(123*…*n)
非递归代码实现
#include<stdio.h>
int main()
{
int n = 0;
//输入n
scanf("%d", &n);
int i = 0;
int ret = 1;
for (i = 1; i <= n; i++)
{
//每次*上一个数放进ret中
ret = ret * i;
}
printf("%d\n", ret);
return 0;
}
1.2递归求阶乘
题目:输入一个数n,求出n的阶乘
输入:3
输出:6
[注] n! =(123*…*n)
对于 递归求阶乘 我们就需要 分情况 了
①对于求 0!和 1!的阶乘,我们可以直接算出来为1
②对于大于1的阶乘就需要递归来实现
例如:n * rec(n-1)如果是1或者0就会出现 1 * rec(0),0*rec(0)返回0这显然是错误的
递归代码实现
#include<stdio.h>
int rec(int n)
{
//n大于等于2
if (n >=2)
{
return n * rec(n - 1);
}
else
{
return 1;
}
}
int main()
{
int n = 0;
scanf("%d", &n);
//调用递归函数,算出递归值
int ret=rec(n);
printf("%d\n", ret);
return 0;
}
2.求斐波那契数
2.1非递归求斐波那契数
题目:求斐波那契数列的第n项
【说明】斐波那契数列(Fibonacci sequence),又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、…… 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:
F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。
输入:5
输出:5
题目分晰:斐波那契数列:1 1 2 3 5 8 13 21 34 55…
首先肯定是先给定数列中的前两个数
后面的数由前两个数相加得出,所以求第n个数,只需要直到它的第n-1个数和第n-2个数(n>2)
我们从题中也能分析出需要 分情况
①求的是前两个数之中的斐波那契数
②求的是第3个数及之后的某个数
非递归代码实现:
#include<stdio.h>
int main()
{
int a = 1;
int b = 1;
int c = 1;
int n = 0;
scanf("%d", &n);
while (n>2)
{
c = a + b;
a = b;
b = c;
n--;
}
printf("%d\n", c);
return 0;
}
2.2递归求斐波那契数
题目:斐波那契数列:1 1 2 3 5 8 13 21 34 55…
这里以1开头的斐波那契数列为例,为0开头的需要单拿出来用分支判断.
怎样能更好理解递归实现的斐波那契数呢?
我们通过画图理解一下吧!!!
递归代码实现:
#include<stdio.h>
int Fib(int n)
{
if (n > 2)
{
return Fib(n - 1) + Fib(n - 2);
}
else
{
return 1;
}
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = Fib(n);
printf("%d\n",ret);
return 0;
}
3.打印一个数的每一位
题目:输入一个数,打印它的每一位(每一位用空格隔开)
输入:1234
输出:4 3 2 1
3.1非递归实现
输入的一个数如何打印每一位呢?
我们可以用%,/ 操作符
%:每次%10得到最后的1位打印
/ :每次除10消去最后一位
非递归代码
#include<stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
while (n)
{
printf("%d ", n % 10);
n = n / 10;
}
return 0;
}
3.2递归实现
如何利用递归操作呢?
代码思路:
先打印%10(最后一位),再递归n/10
print(123) 4
print(12) 3 4
print(1) 2 3 4
分情况讨论:
①如果n为两位数,才能够递归操作
②如果n为一位数直接打印就可以
#include<stdio.h>
void print(int n)
{
//当n是两位数时递归求解
if (n > 9)
{
printf("%d ", n % 10);
print(n / 10);
}
else
{
printf("%d ", n);
}
}
int main()
{
int n = 0;
scanf("%d", &n);
print(n);
return 0;
}
总结
✨✨✨各位读友,本篇分享到内容是否更好的让你理解了函数递归,如果能对你有帮助给个👍赞鼓励一下吧!!
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!!