判断给定Python函数是否为Tail Recursion及实现尾递归数组累加函数
关于尾递归的判断与实现
你的函数是否为尾递归?
是。尾递归的核心特征是递归调用是函数执行的最后一个操作,函数在返回前不需要对递归调用的结果做额外计算。看你的代码:
def addOn(arr, i, j): if i<=j: arr[i] = arr[i] + arr[i-1] return addOn(arr, i+1, j) # 递归调用是最后一步,直接返回结果 return arr
当满足i<=j时,修改数组元素后直接返回递归调用的结果,没有后续计算;不满足条件时直接返回数组,完全符合尾递归的定义。
封装为仅接受数组的尾递归函数
如果要实现一个只接收数组参数的尾递归函数,可以把递归逻辑封装为内部辅助函数,自动处理初始调用参数:
def cumulative_sum(arr): # 边界情况处理:空数组或单个元素直接返回副本 if len(arr) <= 1: return arr.copy() def helper(arr_copy, i): if i < len(arr_copy): arr_copy[i] += arr_copy[i-1] return helper(arr_copy, i+1) # 尾递归调用,无后续操作 return arr_copy return helper(arr.copy(), 1)
关键说明
- 使用
arr.copy()是为了避免修改传入的原数组,保证函数的纯函数特性; - 辅助函数从索引1开始遍历,因为索引0的元素没有前一个元素,无需修改;
- 每次递归调用都是函数的最后一步操作,严格符合尾递归要求。
测试示例
test_arr = [1, 2, 3, 4] print(cumulative_sum(test_arr)) # 输出: [1, 3, 6, 10] print(test_arr) # 原数组未被修改: [1, 2, 3, 4]
内容的提问来源于stack exchange,提问作者smileycoolify
相关产品推荐
相关产品推荐

