函数递归调用

本文介绍了Python函数递归的概念,包括直接和间接的递归调用,并指出Python为防止无限递归设置的限制。通过一个数学问题阐述了递归的回溯和递推阶段,强调递归必须有明确的结束条件。最后,提出了递归在解决某些问题时的实用性,并给出了一个递归应用的实践例子:遍历嵌套列表和查找有序数字列表中的目标数字。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

微信公众号搜索【程序媛小庄】,关注半路出家的程序媛如何靠python开发养家糊口~

引入

函数既可以嵌套定义也可以嵌套调用。嵌套定义指的是在定义一个函数时在该函数内部定义另一个函数;嵌套调用指的是在调用一个函数的过程中函数内部有调用另一个函数。而函数的递归调用指的是在调用一个函数的过程中又直接或者间接的调用该函数本身。

函数递归介绍

函数递归就是函数的递归调用,是函数嵌套调用的一种特殊形式,具体就是指在调用一个函数的过程中直接或者间接的调用到本身,递归的本质就是循环做重复的事情。

在调用func的过程中又调用func,这就是直接调用函数本身;

image-20210526114004480

在调用func的过程中调用foo,而在调用foo的过程中又调用func,这就是间接调用func本身。

image-20210526134328793

通过上面的分析,两种情况下的函数递归调用都是一个无限循环的过程,Python为了防止函数递归进入无限循环对函数递归调用的深度做了限制,一旦超出限制就会抛出异常。

def foo():
    print('foo')
    func()
def func():
    print('func')
    foo()

func()

'''
程序运行结果:
RecursionError: maximum recursion depth exceeded while calling a Python object(超过最大递归深度)
'''

因此为了避免函数递归调用报错,就必须在满足某中条件的情况下结束对函数的递归调用。

def foo(n):
    if n == 1:
 
### C语言中函数递归调用的原理和使用方法 #### 一、递归调用的基本概念 递归是一种在函数内部调用自己的技术。这种机制使得复杂的任务可以通过将其分解为更小的子问题来解决,而这些问题的形式与原问题一致[^2]。递归的核心在于将一个问题逐步简化为基本情形(base case),直到可以直接求解为止。 #### 二、递归调用的工作原理 每当一个函数调用时,系统会在内存中的栈区为其分配一段空间以保存当前函数的状态信息,包括但不限于实际参数、形式参数以及局部变量等。对于递归函数而言,每一次自我调用都会重复这一过程,形成一个新的上下文环境独立于之前的各次调用[^4]。因此,即使同一个变量名可能出现在多次递归调用之中,但由于它们属于不同的活动记录(activation record),所以彼此互不影响。 重要的是要注意到任何递归都需要满足两个必要条件才能正常工作而不至于陷入无限循环或造成堆栈溢出等问题: 1. **基准情况(Base Case)**:这是停止进一步递归的地方,也就是最简单的情况可以直接得出答案无需再次调用自身。 2. **前进进展(Making Progress)**:确保每次递归都能朝着达到基准情况的方向迈进一步而不是停滞不前甚至倒退。 #### 三、经典示例分析 - 阶乘计算 下面给出利用递归来实现阶乘运算的一个典型例子及其解析: ```c #include <stdio.h> // 定义递归函数用于计算整数n的阶乘 long factorial(int n){ if (n == 0 || n == 1){ // 基准情况: 当输入为0或1时返回1 return 1; } else{ return n * factorial(n - 1); // 向下一层递归传递较小数值的同时累积结果 } } int main(){ int number = 5; long result; result = factorial(number); printf("Factorial of %d is %ld\n",number,result); return 0; } ``` 在此程序中,`factorial` 函数通过不断减少 `n` 的值并向更低层次发起新的实例化版本直至遇到基本情况 (`n=0 或者 n=1`) 来完成整个阶乘序列的构建[^5]。 #### 四、注意事项 尽管递归提供了优雅简洁的方式来表达某些算法逻辑,但也伴随着潜在的风险如性能开销较大、容易发生堆栈溢出等情况。所以在设计递归解决方案的时候应该特别留意以下几点: - 明确设定合理的基准状况避免无休止的递归; - 尽量优化递归路径降低不必要的冗余操作提升效率; - 对大规模数据处理场景考虑迭代替代方案防止因过深嵌套而导致失败。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值