副标题 / 摘要

循环常依赖可变变量,而递归可以用参数传递状态。本文展示转换思路与适用场景。

目标读者

  • 学习函数式编程的开发者
  • 想减少可变状态的人
  • 关注代码可推理性的工程师

背景 / 动机

可变状态会降低可推理性并增加错误。
递归可以把状态显式化,从而更安全。

核心概念

  • 递归:函数调用自身
  • 累加器:用参数传递中间状态
  • 不可变性:避免状态被修改

实践指南 / 步骤

  1. 找出循环中的状态变量
  2. 把状态变量变成参数
  3. 定义终止条件
  4. 返回最终结果

可运行示例

# 循环版本

def sum_loop(nums):
    s = 0
    for x in nums:
        s += x
    return s

# 递归版本

def sum_rec(nums, acc=0):
    if not nums:
        return acc
    return sum_rec(nums[1:], acc + nums[0])


if __name__ == "__main__":
    print(sum_loop([1, 2, 3]))
    print(sum_rec([1, 2, 3]))

解释与原理

循环依赖可变变量 s,递归用参数 acc 传递状态。
这样状态是显式的,减少副作用。

常见问题与注意事项

  1. 递归一定更好吗?
    不一定,深度过大会栈溢出。

  2. 为什么要避免可变状态?
    它让推理与并发更困难。

  3. 如何在工程中取舍?
    核心逻辑可用递归,深度大用迭代。

最佳实践与建议

  • 小规模递归优先使用参数累加
  • 关注递归深度与性能
  • 对复杂递归写测试

小结 / 结论

递归通过参数传递状态,减少可变变量。
在可读性与性能之间做适当取舍。

参考与延伸阅读

  • SICP 递归章节
  • Functional Programming Principles

元信息

  • 阅读时长:6~8 分钟
  • 标签:递归、不可变
  • SEO 关键词:循环转递归, 不可变
  • 元描述:演示循环到递归的转换与取舍。

行动号召(CTA)

把一个循环函数改写为递归,并比较可读性与性能。