首页 > 其他分享 >C语言—函数递归

C语言—函数递归

时间:2024-10-09 15:23:08浏览次数:10  
标签:return 函数 迭代 int C语言 斐波 递归 Func

目录

一.递归的概念

①递归的思想

②递归的限制条件

二.递归的一些典型例子

①求n的阶乘

②顺序打印一个整数的每一位

③斐波那契数列

三.递归与迭代


一.递归的概念

①递归的思想

所谓递归,就是把一个大型复杂问题不断转化成一个个规模较小的子问题从而求解,直到子问题不能被拆分。所以递归体现的是一种大事化小的思想

②递归的限制条件

函数在递归的时候存在限制条件,当满足这个限制条件,递归便不再继续。

每次递归调用之后越来越接近这个限制条件。

二.递归的一些典型例子

①求n的阶乘

代码如下:

int Func(int n)
{
	if (n ==0)
		return 1;//0的阶乘为1
	else
		return n * Func(n - 1);//逐渐递归
}
int main()
//计算n的阶乘
{
	int n;
	scanf("%d", &n);//输入n的值
	int ret = Func(n);//调用Func函数
	printf("%d", ret);
	return 0;
}

运行结果如下:

如果用图来描述整个递归过程的话,如下:

②顺序打印一个整数的每一位

题目如下:输入一个整数m,按照顺序打印打印整数的每一位

例如:输入 1234,在屏幕上输出则为:1 2 3 4

要得到整数的每一位,我们只需要对他不断的%10从而得到他的余数,之后我们再对齐/10不断重复直到为0。

代码如下:

void Func(int n)
{
	if (n > 9)
	{
		Func(n / 10);
	}
	printf("%d ", n%10);
}
int main()
{
	int m=0;
	scanf("%d", &m);
	Func(m);
	return 0;
}

如果用图来描述整个递归过程的话,如下:

三.递归与迭代

递归是一种很好的方法,但是每一次调用函数都需要申请一块内存空间用于保存函数调用期间局部变量的值,我们将这块空间称为函数栈帧(后续会由专门一篇讲述函数栈帧)。

函数不返回会导致开辟的栈帧空间过多,从而导致浪费,更严重的会导致栈溢出的问题。

由此,我们引入迭代的思想。所谓迭代,是指利用每一次迭代的结果作为下一次迭代的初始值而不断循环下去。下面我们引入一个比较典型的例子来解读:

例:求出第n个斐波那契数

在求解斐波那契数列的时候,如果我们用递归的思想,那么编译器的运算量会非常大,花费的时间也是我们难以想象的,这个时候就体现出迭代的优点了。用迭代的方法在运行的过程中并不会产生很多重复的运算,比较简洁。

下面我们对比一下两种方法:

首先我们用递归的思想实现斐波那契数列

代码如下:

//用递归的思路实现斐波那契数列
int count = 0;
int Fib(int n)
{
	if (n == 3)
		count++;//统计n=3被计算的次数
	if (n <= 2)
		return 1;
	else
		return Fib(n - 1) + Fib(n - 2);
}

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

可以看出,递归思想实现斐波那契数列的运算量是非常庞大的,引申出来的另一个问题就是非常的耗时。

相反的,如果我们用迭代的思想去实现

代码如下:

int Fib(int n)
{
	int a;
	int b;
	int c;
	while (n>=3)
	{
		c = a + b;
		a = b;
		b = c;
		n--;
	}
	return c;
}

与递归相比,迭代的实现,大大提高了代码运行的速率。

言尽于此,本次对于函数递归的总结就到此结束了,感谢大家的观看,如有不足欢迎大家指出,你们的批评是我进步的动力。

标签:return,函数,迭代,int,C语言,斐波,递归,Func
From: https://blog.csdn.net/2301_81633116/article/details/142783984

相关文章

  • 递归深拷贝导致浏览器网络请求中看不到响应
    前言:在项目中发现一个奇怪的问题,一个请求在数据量少的时候非常快速,数据量多的时候非常慢,甚至导致浏览器崩溃,在浏览器的网络抓包中看到有返回状态时200,但是响应迟迟没有返回,并且可以看到等待服务器响应时间非常长。排查:一开始是定位在后端问题,因为查询类型为1的时候反应速度非常快......
  • tanh激活函数
    公式tanh⁡(x)=sinh⁡(x)cosh⁡(x)=ex−e−xex+e−x图像:tanh函数的输出范围是(-1,1),这意味着无论输入是什么,输出都会被压缩到这个区间内。主要的点是非线性和助于解决梯度爆炸......
  • PTA JAVA语言 面向对象程序设计 作业二 6-3 Person类 构造Person类。包括姓名(name),性
    6-3Person类 谢谢大佬关注,不定期分享学习笔记,希望大佬能多多支持,三连必回单位 山东科技大学构造Person类。包括姓名(name),性别(sex)和年龄(age)。提供所有属性的set和get函数,提供print函数打印其信息输入描述:姓名(name),性别(sex)和年龄(age)输出描述:用户信息裁判测......
  • [快速阅读八] HDR->LDR:Matlab中tonemapfarbman函数的解析和自我实现。
    最近受朋友的委托,想自己实现Matlab里的一个HDR转LDR的函数,函数名是tonemapfarbman,乘着十一假期,稍微浏览下这个函数,并做了一点C++的实现和优化。为了看到这个函数的效果,需要至少matlab R2018b及其以上的版本。 首先,我们下载了matlab帮助文档中提到的该算法对应的论......
  • C语言练习
    今天继续我们的练习。1.调用printf编写一段程序,显示以下内容天地人分析:1.这次题目非常简单,我们只需要知道printf的使用方法(不知道的同学可以看前面我以往发布过的C语言的知识点),并多次打印就可以实现我们想要的效果。实际代码:#include<stdio.h>//头文件intmain()//主......
  • C语言练习
    接下来一段时间,博主要参加军训没有时间更新C语言知识点,但博主会每天更新一道C语言的题作为分享。1.计算并显示整数的差分析:1.题目并不难,首先我们要知道printf这个库函数,是用来打印数据到屏幕的库函数      2.设置变量,在遵循计算机计算的规则(其实和正常的加减乘除......
  • 刷c语言练习题5(牛客网)
    1、若有定义inta[8];,则以下表达式中不能代表数组元素a[1]的地址的是()A、&a[0]+1B、&a[1]C、&a[0]++D、a+1答案:C解析:C选项中&a[0]是一个地址常量,对地址常量的赋值操作是不合法的,错误。2、 以下函数值的类型是:fun(floatx){floaty;y=3*x-4;returny;}A、i......
  • Impala函数语法
    Impala常用函数语法Impala是基于Hadoop的一种高性能分布式SQL查询引擎,它支持使用SQL语言对大规模数据进行分析和查询数学函数函数说明举例ABS(x)绝对值函数,返回一个数的绝对值SELECTABS(-10)ASresult;CEIL(x)向上取整函数,返回大于等于给定数的最小整数SE......
  • C#中函数重载的说明
    一.函数重载的基本概念C#中的函数重载是指在同一个类中定义多个同名的函数,但这些函数的参数类型、参数个数、参数顺序等不同,以便适应不同的调用需求,增加代码的兼容性。二.函数重载的作用2.1定义多个相类似的函数,减少函数的数量,避免命名空间的相互干扰导致的误解;2.2提升程......
  • 简单的c++实现消息发布/订阅机制例子(成员函数被其他类掉调用的例子)
    以下是一个简单的使用C++实现发布/订阅机制的示例代码。这个示例包含一个简单的事件系统,其中有发布者(Publisher)和订阅者(Subscriber)。以下代码需要C++11以上支持#include<iostream>#include<vector>#include<functional>//事件参数结构体,可以根据实际需求修改struc......