副标题 / 摘要
循环常依赖可变变量,而递归可以用参数传递状态。本文展示转换思路与适用场景。
目标读者
- 学习函数式编程的开发者
- 想减少可变状态的人
- 关注代码可推理性的工程师
背景 / 动机
可变状态会降低可推理性并增加错误。
递归可以把状态显式化,从而更安全。
核心概念
- 递归:函数调用自身
- 累加器:用参数传递中间状态
- 不可变性:避免状态被修改
实践指南 / 步骤
- 找出循环中的状态变量
- 把状态变量变成参数
- 定义终止条件
- 返回最终结果
可运行示例
# 循环版本
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 传递状态。
这样状态是显式的,减少副作用。
常见问题与注意事项
递归一定更好吗?
不一定,深度过大会栈溢出。为什么要避免可变状态?
它让推理与并发更困难。如何在工程中取舍?
核心逻辑可用递归,深度大用迭代。
最佳实践与建议
- 小规模递归优先使用参数累加
- 关注递归深度与性能
- 对复杂递归写测试
小结 / 结论
递归通过参数传递状态,减少可变变量。
在可读性与性能之间做适当取舍。
参考与延伸阅读
- SICP 递归章节
- Functional Programming Principles
元信息
- 阅读时长:6~8 分钟
- 标签:递归、不可变
- SEO 关键词:循环转递归, 不可变
- 元描述:演示循环到递归的转换与取舍。
行动号召(CTA)
把一个循环函数改写为递归,并比较可读性与性能。