「函数递归小课堂」~(C语言)

这篇具有很好参考价值的文章主要介绍了「函数递归小课堂」~(C语言)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

「函数递归小课堂」~(C语言),C语言知识,c语言,学习,算法

先赞后看,不足指正!

这将对我有很大的帮助!

所属专栏:C语言知识

阿哇旭的主页:Awas-Home page

目录

引言 

1. 什么是递归?

2. 递归的限制条件 

3. 递归应用举例 

3.1 求 n 的阶乘

3.2 图例演示

3.3 代码实现 

4. 递归问题 

4.1 打印整数n的每一位

4.2 图例演示

4.3 代码实现

5. 递归与迭代 

6. 知识拓展

7. 结语


引言 

        在前面,我们了解并学习到了关于C语言函数相关的概念知识,接下来我们将深入探究函数递归的奥秘。

        那么,话不多说,我们一起来看看吧!


1. 什么是递归?

        递归是我们学习C语言函数经常穿插的一个话题,那递归到底是何方神圣?

        从字面意思理解起来不难,递归其实是一种解决问题的方法,在C语言中,递归就是函数自己调用自己。下面是一个简单的例子:

#include<stdio.h>
int main()
{
	printf("a-wax");
	main(); //main函数自己调用自己
	return 0;
}

        上面举了一个最简单的函数递归例子,运行程序会陷入死递归,导致栈溢出(Stack overflow)。

「函数递归小课堂」~(C语言),C语言知识,c语言,学习,算法


2. 递归的限制条件 

        在我们使用递归的时候,不能让它无限的递归,在达到我们的要求时,就停止。因此,函数递归有两个必要条件:

  • 递归存在限制条件,当满足这个限制条件的时候,递归便不再继续。
  • 每次递归调用之后越来越接近这个限制条件。

3. 递归应用举例 

3.1 求 n 的阶乘

在不考虑栈溢出的情况下,计算正整数 n 的阶乘。

阶乘公式:n ! = n * (n - 1) !

        解题思路:n ! -> n * (n - 1) !

                                  (n - 1) ! ->(n-1) * (n-2) !

                          ......

        通过这样,就可以把一个较大的问题,转换为一个与原问题相似,但规模较小的问题来解决。

3.2 图例演示

「函数递归小课堂」~(C语言),C语言知识,c语言,学习,算法

3.3 代码实现 

// 递归求n的阶乘
#include<stdio.h>

int Fact(int n)
{
	if (n == 0) //回归条件
		return 1;
	else        //递推调用
		return n * Fact(n - 1);
}

int main()
{
	int n = 0;
	printf("请输入要阶乘的数:\n");
	scanf("%d", &n);
	int ret = Fact(n);
	printf("阶乘的结果:%d", ret);
	return 0;
}

「函数递归小课堂」~(C语言),C语言知识,c语言,学习,算法


4. 递归问题 

4.1 打印整数n的每一位

输入一个整数m,打印这个按照顺序打印整数的每一位。

例如:

输入:1014    输出:1 0 1 4

输入:220      输出:2 2 0

        解题思路: 如果n是一位数,n的每一位就是n自己, n是超过一位数的话,就得拆分每一位。

        我们可以发现数字的最低位是最容易得到的,通过%10就能得到。

        此时,可以定义一个print函数来打印n的每一位数字。

Print(n)
如果n是1014,那表⽰为
Print(1014) //打印1014的每⼀位
其中1014中的4可以通过%10得到,那么
Print(1014)就可以拆分为两步:
1. Print(1014/10) //打印101的每⼀位
2. printf(1014%10) //打印4
完成上述2步,那就完成了1014每⼀位的打印
那么Print(101)⼜可以拆分为Print(101/10) + printf(101%10)

4.2 图例演示

「函数递归小课堂」~(C语言),C语言知识,c语言,学习,算法

4.3 代码实现

//打印n的每一位
#include<stdio.h>

void Print(int n)
{
	if (n > 9) //回归条件
	{
		Print(n / 10); //递推调用
	}
	printf("%d ", n % 10);
}

int main()
{
	int n = 0;
	printf("请输入一个数:\n");
	scanf("%d", &n);
	Print(n);
	return 0;
}

「函数递归小课堂」~(C语言),C语言知识,c语言,学习,算法


5. 递归与迭代 

        有时候,递归虽然好用,但也存在一些问题,就比如求第n位斐波那契数,是不适合用递归求解的。

#include<stdio.h>

int Fibon(int n)
{
	if (n <= 2)
		return 1;
	else
		return Fibon(n - 1) + Fibon(n - 2);
}

int main()
{
	int n = 0;
	printf("请输入要求第几个斐波那契数:\n");
	scanf("%d", &n);


	int ret = Fibon(n);
	printf("第%d个斐波那契数为%d\n", n, ret);
	return 0;
}

         当我们输入n位50的时候,需要很长时间才能算出结果,这也说明递归的写法是比较低效的,为什么呢?在递归计算过程中,会有重复计算,且递归层次越深,冗余计算就会越多,这就是导致效率低的主要原因。

        此时,我们可以用迭代的方法来求解:

// 迭代求第n个斐波那契数
#include<stdio.h>

int Fibon(int n)
{
	// 中间变量
	int a = 1;
	int b = 1;
	int c = 1;
	if (n >= 3)
	{
		for (int i = 3; i <= n; i++)
		{
			c = a + b;
			a = b;
			b = c;
		}
	}
	return c;
}

int main()
{
	int n = 0;
	printf("请输入要求第几个斐波那契数:\n");
	scanf("%d", &n);


	int ret = Fibon(n);
	printf("第%d个斐波那契数为%d\n", n, ret);
	return 0;
}

         运行代码,我们会发现,速度明显比递归要快,效率更高。


6. 知识拓展

  • 小青蛙跳台阶问题
  • 汉诺塔问题

7. 结语

        希望这篇文章对大家有所帮助,如果你有任何问题和建议,欢迎在评论区留言,这将对我有很大的帮助。

        完结!咻~

 文章来源地址https://www.toymoban.com/news/detail-832545.html

到了这里,关于「函数递归小课堂」~(C语言)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C语言】——函数递归,用递归简化并实现复杂问题

    不多废话了,直接开始。 递归是学习C语言函数绕不开的⼀个话题,那什么是递归呢? 递归其实是⼀种解决问题的方法,在C语言中,递归就是函数调用自己。 写⼀个史上最简单的C语言递归代码: 上述就是一个简单的递归程序,只不过上面的递归只是为了演示递归的基本形式

    2024年02月05日
    浏览(41)
  • 【C语言】——递归函数,用递归简化并实现复杂问题

    不多废话了,直接开始。 递归是学习C语言函数绕不开的⼀个话题,那什么是递归呢? 递归其实是⼀种解决问题的方法,在C语言中,递归就是函数调用自己。 写⼀个史上最简单的C语言递归代码: 上述就是一个简单的递归程序,只不过上面的递归只是为了演示递归的基本形式

    2024年02月03日
    浏览(36)
  • C语言之函数递归

    前言 从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?\\\"从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?“从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?……”

    2024年02月12日
    浏览(28)
  • <C语言> 函数与递归

    库函数 自定义函数 1.1 库函数 C语言提供了许多库函数(library functions)来简化开发过程并提供常用功能的实现。库函数是预先编写好的函数,可以通过调用这些函数来执行特定的任务。 为什么会有库函数? 我们知道在我们学习C语言编程的时候,总是在一个代码编写完成之后

    2024年02月10日
    浏览(38)
  • 【C语言】函数重难点之函数递归

    大家好,我是深鱼~  目录 一、函数递归知识讲解 1.什么是递归? 2.递归的两个必要条件 2.1练习1: 2.2练习2:  二、递归与迭代 2.1练习3 2.2练习4 1.什么是递归? 程序 调用自身 的编程技巧称为递归 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常

    2024年02月14日
    浏览(57)
  • C语言:函数递归详解(建议收藏)

    程序调用自身的编程技巧称为 递归 ( recursion)。 递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接 调用自身 的一种方法, 它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解 。 优点 :函数递

    2024年02月03日
    浏览(42)
  • 【C语言】函数递归:汉诺塔问题

    汉诺塔问题是一道经典的计算机科学中的递归算法题,通过解决汉诺塔问题以更好的理解递归。 函数递归:函数自己调用自己。 函数递归的两个必要条件: 1.函数自身的调用要有限制条件,如果没有限制条件,就会无限的自己调用自己而导致栈溢出(stack overflow)(关于栈溢

    2024年02月03日
    浏览(38)
  • 【Go】Go 语言教程--Go 语言递归函数(十七)

    往期回顾: Go 语言教程–介绍(一) Go 语言教程–语言结构(二) Go 语言教程–语言结构(三) Go 语言教程–数据类型(四) Go 语言教程–语言变量(五) Go 语言教程–GO语言常量(六) Go 语言教程–GO语言运算符(七) Go 语言教程–GO条件和循环语句(八) Go 语言教程

    2024年02月16日
    浏览(47)
  • c语言从入门到实战——函数递归

    函数递归是指一个函数直接或间接地调用自身,以解决问题的一种方法。在C语言中,函数递归可以用来计算阶乘、斐波那契数列等数学问题。 递归是学习C语言函数绕不开的一个话题,那什么是递归呢? 递归其实是一种解决问题的方法,在C语言中,递归就是函数自己调用自

    2024年02月06日
    浏览(31)
  • C语言——用递归函数计算n!

    归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍+ 收藏⭐ + 留言​📝       比别人多一点努力,你就会多一份成绩!         阶乘是基斯顿·卡曼(Christian Kramp,1760~1826)于 1808 年发

    2024年02月03日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包