我编写的这段Ruby递归求和代码是否属于递归函数?
你的代码确实是递归函数,但有个小细节需要优化!
首先可以明确告诉你:你写的recursive_sum绝对是一个递归函数,完全符合递归的定义——它在函数内部调用了自身,同时具备递归必需的两个核心要素:
- 基线条件(Base Case):当输入的数组为空时返回0,这是终止递归的关键,确保函数不会无限调用自身导致栈溢出。
- 递归步骤(Recursive Step):把“求整个数组的和”拆解成“第一个元素的值 + 求剩余数组的和”这个更小的子问题,逐步缩小问题规模,最终收敛到基线条件。
不过你的代码有个容易被忽略的小问题:list.shift方法会直接修改传入的原数组。比如你执行这段代码后:
my_list = [1,2,3,4] recursive_sum(my_list) puts my_list.inspect # 输出会是 [],原数组被清空了
这通常不是函数应该有的行为——调用函数不应该对传入的参数产生副作用。我们可以用数组切片来避免这个问题,修改后的代码如下:
def recursive_sum(list) if list.empty? 0 else # 用list[0]取第一个元素,list[1..-1]获取从第二个元素到末尾的子数组 list[0] + recursive_sum(list[1..-1]) end end
如果喜欢更简洁的写法,也可以用三元表达式:
def recursive_sum(list) list.empty? ? 0 : list[0] + recursive_sum(list[1..-1]) end
这样修改后,递归的逻辑完全不变,同时不会改动原数组。测试一下:
my_list = [1,2,3,4] puts recursive_sum(my_list) # => 10 puts my_list.inspect # => [1,2,3,4] 原数组保持原样
内容的提问来源于stack exchange,提问作者Xullnn
相关产品推荐
相关产品推荐

