迭代:
定义:通过循环(如 for 或 while 循环)重复执行一段代码,直到满足某个条件。
特点:使用一个或多个变量来跟踪状态并更新它们,直到满足终止条件。
示例:计算数组中所有元素的总和。
def sum_iterative(arr):
total = 0
for num in arr:
total += num
return total
递归:
定义:函数在其定义中调用自身,直到满足某个终止条件(基准情形)。
特点:通过将问题分解为更小的子问题来解决,通常需要明确的终止条件以避免无限递归。
示例:计算数组中所有元素的总和。
def sum_recursive(arr):
if not arr: # 基准情形
return 0
else:
return arr[0] + sum_recursive(arr[1:])
性能和资源
迭代:
优点:通常比递归更高效,因为没有函数调用的开销。内存使用较少,因为只需维护少量的循环控制变量。
缺点:对于某些问题(如树形结构遍历),编写迭代版本可能会更复杂。
递归:
优点:代码通常更简洁和易读,特别是对于分治法等问题。递归自然地表达了某些问题的结构。
缺点:可能会导致较大的内存开销,因为每个递归调用都需要维护自己的调用栈帧。深度递归可能会导致栈溢出错误。
应用场景
迭代:适用于那些可以用简单的循环和条件判断来解决的问题,如遍历数组、链表等线性结构。
递归:适用于那些可以被分解为相似子问题的问题,如树形结构的遍历、汉诺塔问题、某些数学计算(如阶乘、斐波那契数列)等。
计算阶乘
迭代版本:
def factorial_iterative(n):
result = 1
for i in range(1, n + 1):
result *= i
return result
递归版本:
def factorial_recursive(n):
if n == 0:
return 1
else:
return n * factorial_recursive(n - 1)