C语言之函数递归

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

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

1. 概念

C语言中,函数直接或间接调用函数本身,则该函数称为递归函数

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

递归的主要思考方式在于:把大事化小

2. 递归的两个必要条件

//例子:
void func()
{
	//...
	if(...)
		func();//调用自身
	else
	//...
}

在上面的例子中能够看出,它必须满足以下两个条件:

🍥 在每一次调用自己时,必须是(在某种意义上)更接近于解;
🍥 必须有一个终止处理或计算的限制条件,当满足这个限制条件的时候,递归便不再继续。

🍤实例1:

接收一个整型值(无符号),按照顺序打印他的每一位。
例如:
   输入123,输出1 2 3

非递归:

#include<stdio.h>
int main()
{
	int n=123;
	int a = n / 100;//取百位
	int b = (n / 10)%10;//取十位
	int c = n % 10;//取个位
	//依次输出
	printf("%d %d %d\n", a, b, c);
	return 0;
}

递归

#include<stdio.h>
void Fun_c(int x)
{
	if (x >9)//限制条件
	{
	Fun_c(x/10);
	}
	printf("%d ", x%10);
}

int main()
{
	int n;
	scanf("%d", &n);
	Fun_c(n);
	return 0;
}

图解:
C语言之函数递归,c语言

🍤实例2:

编写函数不允许创建临时变量,求字符串的长度。

int Length(char* s)
{
	if (*s == '\0')//限制条件
		return 0;
	else
		return 1 + Length(s + 1);

}

#include<stdio.h>
int main()
{
	char* ch = "iloveC";//字符串结束标志:'\0'
	int len = Length(ch);
	printf("%d", len);
	return 0;
}

第一次 s=“iloveC\0”------5+1
第二次 s=“loveC\0”-----4+1
第三次 s=“oveC\0”----3+1
第四次 s=“veC\0”----2+1 ( 回退)
第五次 s=“eC\0”----1+1
第六次 s=“C\0”----1+0
第七次 s=“\0”-----0

C语言之函数递归,c语言

3. 递归与迭代

3.1 求n的阶乘

C语言之函数递归,c语言

//递归
#include<stdio.h>
int Fac(int n)
{
	if (n == 1)//限制条件
		return 1;
	else
		return n * Fac(n - 1);
}

int main()
{
	int n;
	scanf("%d", &n);
	int temp = Fac(n);
	printf("%d\n", temp);
	return 0;
}
//迭代
int Fac(int n)
{
	int temp = 1;
	for (int i = 1; i <= n; i++)
	{
		temp = temp * i;
	}
	return temp;
}

#include<stdio.h>
int main()
{
	int n;
	scanf("%d", &n);
	printf("%d\n", Fac(n));
	return 0;
}

3.2 求第n个斐波那契数

1 1 2 3 5 8 13 21…
从第三位开始,后一项等于前两项之和

C语言之函数递归,c语言

//递归
#include<stdio.h>
int Fib(int n)
{
	if (n == 1 || n == 2)//限制条件
		return 1;
	else
		return Fib(n - 1) + Fib(n - 2);

}
int main()
{
	int n;
	scanf("%d", &n);
	printf("%d\n", Fib(n));
	return 0;
}
//迭代
#include<stdio.h>
int Fib(int n)
{
	int a = 1;
	int b = 1;
	int c;
	while (n >= 3)
	{
		c = a + b;
		a = b;
		b = c;
		n--;
	}
	return c;
}

int main()
{
	int n;
	scanf("%d", &n);
	printf("%d\n", Fib(n));
	return 0;
}

注:
🍥 许多问题是以递归的形式进行解释的,这只是因为它比非递归的形式更为清晰。
🍥 但是这些问题的迭代实现往往比递归实现效率更高,虽然代码的可读性稍微差些。
🍥 当一个问题相当复杂,难以用迭代实现时,此时递归实现的简洁性便可以补偿它所带来的运行时开销。


结束语

递归是函数实现的一个很重要的环节,我们不但要理解,还要掌握,能够熟练使用递归,希望这篇文章能够帮助到你。
  惟有主动付出,才有丰富的果实获得收获。
  我们下一篇文章再见。
C语言之函数递归,c语言文章来源地址https://www.toymoban.com/news/detail-520979.html

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

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

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

相关文章

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

    先赞后看,不足指正! 这将对我有很大的帮助! 所属专栏:C语言知识 阿哇旭的主页:Awas-Home page 目录 引言  1. 什么是递归? 2. 递归的限制条件  3. 递归应用举例  3.1 求 n 的阶乘 3.2 图例演示 3.3 代码实现  4. 递归问题  4.1 打印整数n的每一位 4.2 图例演示 4.3 代码实现 5.

    2024年02月21日
    浏览(31)
  • 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)
  • Go语言之函数补充defer语句,递归函数,章节练习

    defer语句是go语言提供的一种用于注册延迟调用的机制,是go语言中一种很有用的特性。 defer语句注册了一个函数调用,这个调用会延迟到defer语句所在的函数执行完毕后执行,所谓执行完毕是指该函数执行了return语句、函数体已执行完最后一条语句或函数所在协程发生了恐慌

    2024年02月17日
    浏览(50)
  • c语言基础知识帮助理解(函数递归详解)

    \\\"从前有座山,山里有座庙,庙里有个老和尚和一个小和尚。有一天老和尚对小和尚说:“从前有座山.山里有座庙,庙里有个老和尚和一个小和尚,有一天老和尚对小和尚说:“从前有座山.山里有座庙,庙里有个老和尚和一个小和尚......\\\" (虽能体现递归特点,但又不是递归)

    2024年02月14日
    浏览(39)
  • 掌握Go语言:Go语言递归函数,解密编程之谜,探索算法的奥秘!(27)

    递归函数是指在函数内部调用自身的函数。在Go语言中,递归函数使用起来非常方便,但需要注意递归的终止条件,以避免无限循环。 Go语言递归函数的使用方法 在Go语言中,编写递归函数的基本步骤如下: 上述三点内容详细解释如下: 定义一个函数,函数内部调用自身 :

    2024年04月15日
    浏览(55)
  • 掌握Go语言:探索Go语言递归函数的高级奥秘,优化性能、实现并发、解决算法难题(28)

    递归函数在Go语言中是一种强大的工具,能够解决许多复杂的问题。除了基本的递归用法外,Go语言还提供了一些高级用法,使得递归函数更加灵活和强大。本文将深入探讨Go语言递归函数的高级用法,包括尾递归优化、并发递归和记忆化递归等。 尾递归优化 尾递归是一种特

    2024年04月10日
    浏览(53)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包