直接回答:循环与递归都能表达重复计算,机械改写方法是:把循环体变成递归函数体,把循环变量变成函数参数,把"继续循环"变成递归调用,把循环终止条件变成递归的基准情形。要求只用不可变结构时,不能原地修改变量,就把每轮迭代的中间结果作为新的参数值传下去(常用累加器参数)。

展开解析:关键对应关系:迭代的状态(如求和里的 sum、下标 i)→ 递归的函数参数;i++ → 递归调用时传 i + 1;循环出口 → 基准返回。这样写出的版本往往是尾递归,支持尾调用优化的语言(Scheme、Scala、Kotlin 的 tailrec 等)可将其编译回循环,不占额外栈帧;Java、Python 不做尾调用优化,深递归仍会栈溢出,这是改写时必须权衡的。递归版的优势是天然契合不可变数据与数学归纳式思维,劣势是可读性依赖习惯、且有栈深限制。追问方向:如何把非尾递归改尾递归(加累加器)、CPS(续延传递风格)、递归转迭代用显式栈。

示例

# 循环版
def total(xs):
    s = 0
    for x in xs:
        s += x
    return s

# 不可变 + 尾递归版
def total(xs, i=0, acc=0):
    if i == len(xs):
        return acc
    return total(xs, i + 1, acc + xs[i])