Python之递归

所谓递归其实就是函数本身调用函数,直到满足指定条件之后一层层退出函数, 例如

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


  • 利用函数编写一个斐波那契数列

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368

斐波那契数列就是前面给两个数相加得到后面一个数,依次往后

代码如下

#!/usr/bin/env python# _*_ coding: utf-8 _*_def Counter(n1, n2):    if n1 > 10000:  
# 当要计算的值大于10000就退出        return    print("Counter:", n1)  
# 输出当前计算到那个值了    n3 = n1 + n2  
# 第一个值加上第一个值等于第三个值    Counter(n2, n3)  
# 调用计数器函数,此时第一个值是调用函数传过来的最后一个值,而第二个值是计算出来的第三个值Counter(0, 1)  
# 调用计数器函数

输出结果

/usr/bin/python3.5 /home/ansheng/Documents/PycharmProjects/blogcodes/斐波那契.pyCounter: 0Counter: 1Counter: 1Counter: 2Counter: 3Counter: 5Counter: 8Counter: 13Counter: 21Counter: 34Counter: 55Counter: 89Counter: 144Counter: 233Counter: 377Counter: 610Counter: 987Counter: 1597Counter: 2584Counter: 4181Counter: 6765Process finished with exit code 0
  • 利用递归获取斐波那契数列中的第10个数,并将该值返回给调用者

代码:

#!/usr/bin/env python# _*_ coding: utf-8 _*_def Counter(Index, Start, End):    print("第%d次计算,第一个数字是%d,第二个数字是%d" % (Index, Start, End))    if Index == 10:  
# 如果要计算的值是10就退出        return Start    N = Start + End  
# N等于第一个数加上第二个数    Number = Counter(Index + 1, End, N)  
# 继续调用计数器函数,End相当与传给函数的第一个数,N是传给函数的第二个数    return Numberresult = Counter(1, 0, 1)print("得出的数字是:", result)

输出结果

/usr/bin/python3.5 /home/ansheng/Documents/PycharmProjects/blogcodes/递归.py第1次计算,第一个数字是0,第二个数字是1第2次计算,第一个数字是1,第二个数字是1第3次计算,第一个数字是1,第二个数字是2第4次计算,第一个数字是2,第二个数字是3第5次计算,第一个数字是3,第二个数字是5第6次计算,第一个数字是5,第二个数字是8第7次计算,第一个数字是8,第二个数字是13第8次计算,第一个数字是13,第二个数字是21第9次计算,第一个数字是21,第二个数字是34第10次计算,第一个数字是34,第二个数字是55得出的数字是: 34Process finished with exit code 0


<think>好的,用户想了解如何用Python实现递归的示例代码。首先,我需要回忆递归的基本概念,确保自己理解正确。递归是指在函内部调用自身的方法,通常用于解决可以分解为相似子问题的情况,比如阶乘、斐波那契列等。接下来,我要考虑用户可能的背景。他们可能刚开始学习Python,对递归不太熟悉,需要简单明了的例子和解释。用户提供的引用中有提到阶乘和斐波那契列的例子,这些可以作为基础示例。但可能还需要其他例子来展示不同的应用场景,比如遍历目录结构或者处理树形据,这样用户能更全面地理解递归的用途。 然后,我需要检查用户给的引用内容,确保回答符合他们的需求。引用[1]和[2]提到了递归的基本概念和阶乘的例子,引用[3]是斐波那契列,引用[4]涉及递归中的控制流。用户明确要求示例代码,所以应该提供多个不同场景的示例,并解释每个例子的工作原理。还要注意用户可能遇到的常见问题,比如递归深度过深导致的栈溢出,或者递归效率问题。例如,斐波那契列的递归实现在n较大时效率很低,可以提到这一点,并建议使用循环或记忆化优化。不过用户的主要需求是示例,所以这部分可以作为注意事项补充。 另外,用户提到的系统级指令要求使用中文回答,学公式用$...$格式,独立公式用$$...$$。但当前问题主要涉及代码示例,可能学公式不多,但如果有涉及比如递推公式,需要正确应用格式。例如,斐波那契列的定义可以用学公式表示。需要确保代码示例正确且符合Python语法。例如,递归必须有终止条件,否则会导致无限递归。在每个示例中都要突出显示终止条件,比如阶乘中的n ==1,斐波那契中的n<=1。可能还需要考虑用户对递归的理解程度,是否了解递归栈的工作原理。因此,在解释每个示例时,分步骤说明执行过程会有帮助。例如,阶乘函如何一步步拆解问题,直到达到基线条件,再逐层返回结果。最后,生成相关问题,帮助用户进一步学习。问题可以涉及递归的优化、应用场景、与其他算法对比等,这样用户可以根据自己的兴趣深入探索。</think>### Python递归实现详解及示例代码 递归是通过函内部调用自身实现循环运算的编程范式,需满足两个核心条件: 1. 基线条件(终止条件) 2. 递归关系式(问题分解方法) #### 一、基础递归示例 1. **阶乘计算** 学定义:$n! = n \times (n-1)!$,基线条件$0! = 1$ ```python def factorial(n): if n == 0: return 1 # 基线条件 else: return n * factorial(n-1) # 递归调用 ``` 2. **斐波那契列** 学定义:$F(n) = F(n-1) + F(n-2)$,基线条件$F(0)=0, F(1)=1$ ```python def fibonacci(n): if n <= 1: return n # 基线条件 else: return fibonacci(n-1) + fibonacci(n-2) ``` #### 二、实用场景示例 3. **目录遍历(树形结构处理)** ```python import os def scan_dir(path, level=0): print(' ' * level + '📁', os.path.basename(path)) for item in os.listdir(path): full_path = os.path.join(path, item) if os.path.isdir(full_path): scan_dir(full_path, level+1) # 递归处理子目录 else: print(' ' * (level+1) + '📄', item) ``` 4. **汉诺问题** 学解法:$T(n) = 2T(n-1) + 1$ ```python def hanoi(n, source, target, auxiliary): if n > 0: hanoi(n-1, source, auxiliary, target) # 移动n-1层到中间柱 print(f"移动圆盘 {n} 从 {source} 到 {target}") hanoi(n-1, auxiliary, target, source) # 移动n-1层到目标柱 ``` #### 三、递归注意事项 - **递归深度限制**:Python默认递归深度不超过1000层(可通过`sys.setrecursionlimit()`修改) - **重复计算问题**:斐波那契示例存在重复计算,可用记忆化优化 - **尾递归优化**:Python未实现尾递归优化,建议使用循环处理深层递归 #### 优化示例(记忆化斐波那契) ```python from functools import lru_cache @lru_cache(maxsize=None) def fibonacci_opt(n): if n <= 1: return n return fibonacci_opt(n-1) + fibonacci_opt(n-2) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值