函数递归 --- 递归练习三道题(斐波那契,阶乘,打印每一位数)

✨✨✨学习的道路很枯燥,希望我们能并肩走下来!

编程真是一件很奇妙的东西。你只是浅尝辄止,那么只会觉得枯燥乏味,像对待任务似的应付它。但你如果深入探索,就会发现其中的奇妙,了解许多所不知道的原理。知识的力量让你沉醉,甘愿深陷其中并发现宝藏。


前言

本篇通过三道练习题了解函数递归,实现函数递归的简单运用,如有错误,请在评论区指正,让我们共同进步!

本文开始

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;
}

总结

✨✨✨各位读友,本篇分享到内容是否更好的让你理解了函数递归,如果能对你有帮助给个👍赞鼓励一下吧!!
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值