递迴 (Recursion) 在程式设计中是一个强大的概念,指的是一个函式在它的定义中直接或间接地呼叫自己。就像一面镜子不断地反射自己的影像一样,递迴函式会不断地呼叫自己,直到满足某个条件为止。
形象比喻:想像你在一个房间里,房间里有一面镜子,镜子对着墙壁。你站在镜子前,镜子里会反射出你的影像。这个影像又在镜子里产生了一个更小的影像,如此不断重复。这就像一个函式不断地呼叫自己一样。
Python 递迴的特性:
基底条件 (Base Case): 每个递迴函式都必须有一个或多个基底条件,当满足这个条件时,函式不再呼叫自己,而是直接返回结果。这就像镜子对着墙壁,影像最终会消失。递迴关系式 (Recursive Case): 函式会呼叫自己,但参数会有所变化,让函式逐渐接近基底条件。这就像镜子中的影像越来越小。简单的递迴范例:计算阶乘
def factorial(n):
if n == 0:
return 1 # 基底条件:0 的阶乘为 1
else:
return n * factorial(n - 1) # 递迴关系式
解释:当 n 等于 0 时,直接返回 1。否则,返回 n 乘以 n-1 的阶乘。函式会不断地呼叫自己,直到 n 等于 0 为止。
为什么要使用递迴?
-解决复杂问题: 递迴可以简洁地解决一些复杂的问题,例如树的遍历、图的搜索等。-描述递归结构: 对于具有递归定义的问题,递迴函式能更自然地表达问题的解法。-函式式编程: 递迴是函式式编程的重要概念。
递迴的缺点:
效率问题: 过多的递迴呼叫可能会导致栈溢出,影响程式性能。难以理解: 递迴的思维方式对于初学者来说可能比较抽象。
何时使用递迴?
问题具有递归结构。问题可以分解为更小的子问题,且子问题与原问题具有相同的形式。基底条件明确。
阶乘是什么?
阶乘是一个数学概念,表示从 1 开始连续乘到这个数的所有正整数的积。用数学符号「!」表示。例如:5 的阶乘,记作 5!,等于 5 × 4 × 3 × 2 × 1 = 120。n 的阶乘,记作 n!,等于 n × (n-1) × (n-2) × ... × 3 × 2 × 1。
阶乘的特性:
0 的阶乘定义为 1,也就是 0! = 1。阶乘的值增长非常快,即使是比较小的数字,其阶乘也会是一个很大的数。
在生活中的例子算出排列组合有几种:
-密码-抽奖-分配工作-科学实验
Python 里的阶乘范例
def factorial_recursive(n):
if n == 0 or n == 1:
return 1
else:
return n * factorial_recursive(n - 1)
# 计算4的阶乘
result = factorial_recursive(4)
print(result) # 输出:24
费氏数列的定义
费氏数列从 0 和 1 开始,之后的每个数字都是前两个数字的和。也就是说:
费氏数列的前几项是:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...f(0) = 0f(1) = 1f(2) = f(1) + f(0) = 1 + 0 = 1f(3) = f(2) + f(1) = 1 + 1 = 2f(4) = f(3) + f(2) = 2 + 1 = 3
F(0) = 0
F(1) = 1
F(n) = F(n-1) + F(n-2) (当 n > 1)