我很抱歉,但我无法想到好的头衔
我的问题是,为什么这个递归函数在数组中添加数字:
def add_numbers(arr)
return arr.first if arr.size == 1
return nil if arr.empty?
arr.pop + add_numbers(arr[0..-1])
end
但不是这一个:
def add_numbers(arr)
return arr.first if arr.size == 1
return nil if arr.empty?
arr = arr[0...-1]
arr.last + add_numbers(arr[0..-1])
end
我收到的错误是
TypeError: nil can't be coerced into Fixnum
因为arr.last在最后一步是零,我想。我试过在纸上做记忆模型,但我仍然无法弄清楚为什么第一个不等于第二个。
由于
答案 0 :(得分:0)
在我的情况下,它运作良好,但结果不好,问题就出现了:
arr = arr[0...-1]
而不是
arr.pop
使用pop你可以修改arr,使用out last number更小并返回最后一个数字,另一个则在获得最后一个之前使数组更小:
[32] pry(main)> a = [1,2,3,4,5]
=> [1, 2, 3, 4, 5]
[33] pry(main)> a.pop
=> 5
[34] pry(main)> a
=> [1, 2, 3, 4]
[35] pry(main)> a = [1,2,3,4,5]
=> [1, 2, 3, 4, 5]
[36] pry(main)> a = a[0...-1]
=> [1, 2, 3, 4]
[37] pry(main)> a.last
=> 4
让我们为您的函数添加一些调试器:
def add_numbers(arr)
puts "array = #{arr}"
puts "length = #{arr.length}"
return arr.first if arr.size == 1
return nil if arr.empty?
arr.pop + add_numbers(arr[0..-1])
end
def add_numbers(arr)
puts "array = #{arr}"
puts "length = #{arr.length}"
return arr.first if arr.size == 1
return nil if arr.empty?
arr = arr[0...-1]
arr.last + add_numbers(arr[0..-1])
end
分别带有以下输出:
[1] pry(main)>
[1] pry(main)* => :add_numbers
[2] pry(main)> add_numbers [1, 2, 3, 4, 5]
array = [1, 2, 3, 4, 5]
length = 5
array = [1, 2, 3, 4]
length = 4
array = [1, 2, 3]
length = 3
array = [1, 2]
length = 2
array = [1]
length = 1
=> 15
[11] pry(main)>
[11] pry(main)* => :add_numbers
[12] pry(main)> add_numbers [1, 2, 3, 4, 5]
array = [1, 2, 3, 4, 5]
length = 5
array = [1, 2, 3, 4]
length = 4
array = [1, 2, 3]
length = 3
array = [1, 2]
length = 2
array = [1]
length = 1
=> 11
所以你应该把最后一个函数改成这样的东西:
def add_numbers(arr)
puts "array = #{arr}"
puts "length = #{arr.length}"
return arr.first if arr.size == 1
return nil if arr.empty?
arr.last + add_numbers(arr[0...-1])
end
使用以下输出
[39] pry(main)> add_numbers [1, 2, 3, 4, 5]
array = [1, 2, 3, 4, 5]
length = 5
array = [1, 2, 3, 4]
length = 4
array = [1, 2, 3]
length = 3
array = [1, 2]
length = 2
array = [1]
length = 1
=> 15
答案 1 :(得分:0)
假设
arr = [1,2,3]
在第一种情况下,
last = arr.pop
#=> 3
arr
#=> [1,2]
arr[0..-1]
#=> [1,2]
last + add_numbers(arr[0..-1])
#=> 3 + add_numbers([1,2])
在第二种情况下,
arr[0..-1]
#=> [1,2,3]
arr = arr[0...-1]
#=> [1,2]
arr[0..-1]
#=> [1,2]
arr.last + add_numbers(arr[0..-1])
#=> 2 + add_numbers([1,2])
答案 2 :(得分:0)
在某个范围内,..
包含在内,...
是独占的。如果arr = [1, 2, 3]
,arr[0..-1] == [1, 2, 3]
而arr[0...-1] == [1, 2]
在第二种方法的第一次迭代中,这是你的最后一行
2 + add_numbers([1, 2])
将其与您的工作方法进行比较
3 + add_numbers([1, 2])
您肯定会得到错误的结果,但如果所有输入都是整数,则不应该出现nil
错误。所以问题是,你的意见是什么?
`