首页 > 其他分享 >函数的递归

函数的递归

时间:2024-12-15 16:59:45浏览次数:9  
标签:调用 return 函数 递归 int 函数调用

一、递归

1.什么是递归

在C语言中,递归就是函数自己调用自己。

把一个大问题层层转换为一个与原问题相似,但规模较小的子问题来解决;知道子问题不能被拆分,递归就结束,所以递归的思想方式就是把大事化小的过程。

2.递归的限制条件

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

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

3.例题

请运用递归的思想完成数字n的阶乘(n为正整数)。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int fac(int n)
{
	if (n==1)
	{
		return 1;
	}
	else
	{
		return fac(n - 1) * n;
	}
}
int main()
{
	int n;
	scanf("%d", &n);
	int c = fac(n);
	printf("%d", c);
	return 0;
}

 二、迭代

在C语言中每一次函数的调用,都需要本次函数调用在内存的栈区,申请一块内存空间来保存函数调用期间的各种局部变量的值,这块空间被称为运行时堆栈或者函数栈帧。

函数不返回时,函数对应的栈帧空间就一直被占用,所以如果函数调用中存在递归调用的话,每一次递归函数调用都会开辟属于自己的栈帧空间,直到函数递归不在继续,开始回归,才会逐渐释放栈帧空间。

此时我们就可以运用迭代的方式来完成。

例题

计算第n个斐波那契数列的值。

1.用递归的方式来解决

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int fib(int n)
{
	if (n <= 2)
	{
		return 1;
	}
	else
	{
		return fib(n - 1) + fib(n - 2);
	}
}
int main()
{
	int n;
	scanf("%d", &n);        //此时虽然能计算出结果但是当n的值比较大时计算的时间就比较长,具体原因上面有写。此时我们应该考虑用迭代的方式来写。
	int c = fib(n);
	printf("%d", c);
	return 0;
}

2.用迭代的方式解决

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int fib(int n)
{
	int a = 1, b = 1, c = 1;
	if (n<=2)
	{
		return 1;
	}
	while (n>=3)
	{
		c = a + b;
		a = b;
		b = c;
		n--;
	}
	return c;
}
int main()
{
	int n;
	scanf("%d", &n);
	int c = fib(n);
	printf("%d", c);
	return 0;
}

标签:调用,return,函数,递归,int,函数调用
From: https://blog.csdn.net/laodiehl/article/details/144487007

相关文章

  • 函数的定义与调用
    一、函数的定义1.基本规则①函数分为main函数(主函数)与其他函数②程序的入口从main函数开始③main函数可以调用其他函数,但其他函数不可以调用main函数2.定义形式返回值类型 函数名(形参){函数体;return返回值;} 注意: ①返回值类型与返回值相同 ②返回值省略......
  • zblog函数GetCategoryByID:通过分类ID获取分类对象数据
    函数位置:zblogphp.php文件,大约3300行。函数参数:$id:整数类型,要获取数据的分类ID。函数输出:返回一个对象,包含指定分类的所有值。示例:if($zbp->GetCategoryByID(1)->ID!=0){//存在ID是1的分类echo$zbp->GetCategoryByID(1)->Name;}其他数......
  • spark如何自定义函数
    UDF:一对一的函数【UserDefinedFunctions】substr、split、concat、instr、length、from_unixtimeUDAF:多对一的函数【UserDefinedAggregationFunctions】聚合函数count、sum、max、min、avg、collect_set/listUDTF:一对多的函数【UserDefinedTabularFunctions】ex......
  • 【Linux】poll函数
    poll和select的区别不大,主要是poll没有连接数限制,因为它用的链表实现#include<poll.h>intpoll(structpollfd*fds,nfds_tnfds,inttimeout);structpollfd{intfd;//要监控的文件描述符,如果fd为-1,表示内核不再监控shortevents;//......
  • 在Less中有哪些常用的函数?
    在Less中,存在许多实用的函数来帮助开发者更高效地编写和维护CSS代码。以下是一些常用的Less函数:字符串函数escape(@string):通过URL-encoding编码字符串。e(@string):对字符串进行转义处理。%(@string,values...):格式化字符串。replace('content','要进行替换的值',替换值):替......
  • 实现一个批量请求函数 multiRequest(urls, maxNum)
    在前端开发中,处理多个异步请求的一种常见需求是批量请求,并限制并发请求的数量以避免对服务器造成过大压力或浏览器资源耗尽。你可以使用Promise.all、Array.prototype.map和Array.prototype.reduce等方法来实现一个批量请求函数multiRequest,该函数接受一个URL数组和一个最......
  • 在非函数内写return语句,会有什么问题?
    在前端开发或任何编程语言中,return语句主要用于从函数中返回一个值或提前退出函数。如果你在非函数内(例如在全局作用域或代码块中)使用return语句,会导致语法错误或逻辑问题。以下是一些关键点:语法错误:在大多数编程语言中,包括JavaScript,return语句只能在函数体内使用。如果......
  • 考研数学二 2011-2024年 真题积累总结【多元函数与微分方程篇】_多元函数二阶导数_非
    文章目录多元函数1.多元函数二阶导数问题:f^''^~xy~(0,0)与f^''^~yx~(0,0)的计算(是否存在)2.多元函数非条件极值问题3.多元函数基础经典题已知对x的偏导数和对y的偏导数,求f(x,y)微分方程1.利用已知条件,构造微分方程,求y(x)的表达式2.给出关于f(x)的两个微分方程,求这个f......
  • 写一个方法记录函数运行的时间
    在前端开发中,记录一个函数运行的时间是一个常见的需求,通常用于性能调优和调试。你可以使用JavaScript提供的Date对象或者performanceAPI来实现这一功能。下面是两种方法的示例:方法一:使用Date对象Date对象可以获取当前的时间戳,通过计算函数执行前后的时间差,可以得到函......
  • QT 定义全局变量、通过函数初始化变量
    1.头文件中定义全局变量#ifndefZ3_GVARS_H#defineZ3_GVARS_H#include<QString> classZ3_GVARS{ public: staticQStringJSON_FILE_NAME; staticQStringSERVER_IP; staticintSERVER_PORT; staticvoidinitConfig();};#endif//!Z3_GVARS_H 2.在cpp......