递归函数,可变参数列表

本文介绍了递归的概念,包括其主要思想是大事化小,通过示例解释了斐波那契数列和阶乘的递归求解。同时,讨论了递归的必要条件、缺点(如栈溢出和效率问题)以及如何通过改写为非递归或使用静态变量来优化。接着转向可变参数列表,阐述了C语言中实现可变参数的方法,包括使用`stdarg.h`头文件,`va_list`、`va_start`、`va_arg`和`va_end`宏的用途,并提醒了使用可变参数列表时应注意的事项。
摘要由CSDN通过智能技术生成

递归

1.什么是递归?

递归就是函数或过程在其定义或声明的中有直接或间接调用自身的一种方式。他通常将一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。

2.递归的主要思想:大事化小

求第n个斐波那契数(不考虑溢出)

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

求n的阶乘:

int factorial(int n)
{
	if (n <= 1)
		return 1;
	else
		return n*factorial(n - 1);
}

不允许建立临时变量,求字符串长度

int my_strlen(char* str)
{
	if (*str == '\0')
		return 0;
	else
		return 1 + my_strlen(str + 1);
}

3.递归的俩个必要条件

  • 存在限制条件,当满足这个限制条件的时候,递归便不在继续(递归要有出口)
  • 每次递归之后越来越接近这个限制条件

4.递归的缺点

  • 系统分配给程序的栈空间是有限的,单数如果出现了死循环,死递归等问题,就可能导致一直开辟空间,最终产生栈空间耗尽的情况,这样的现象我们叫做栈溢出
  • 递归虽然使程序的可读性强,思维逻辑更清晰,但其效率低

5.如何解决上述问

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值