arr.last在递归add_numbers

时间:2017-08-02 05:45:33

标签: arrays ruby recursion

我很抱歉,但我无法想到好的头衔

我的问题是,为什么这个递归函数在数组中添加数字:

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在最后一步是零,我想。我试过在纸上做记忆模型,但我仍然无法弄清楚为什么第一个不等于第二个。

由于

3 个答案:

答案 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错误。所以问题是,你的意见是什么? `