带有.chr.to_i的NoMethodError

时间:2016-09-17 06:55:15

标签: ruby recursion

我试图创建一个递归方法sum_of_digits(i),它取整数之和,即' 456' = 4 + 5 + 6 = 15

但是,我在以下代码中收到了chr.to_i的NoMethodError:

def sum_of_digits(i)
  input = i.to_s
  if i == 0
    return 0
  elsif input.length == 1
    return i
  else
    for n in 1..input.length
      sum += input[i].chr.to_i % 10^(n-1)   
    end
  end
  return sum
end

谢谢!

1 个答案:

答案 0 :(得分:1)

字符串索引在ruby中基于零。问题出在这里:

for n in 1..input.length

应该写成

for n in 0..input.length-1

顺便说一下,调用chr也是多余的,因为你已经有一个数字的字符串表示。同样,sum必须提前声明并设置为零。

此外,整个代码不是ruby惯用语:应该避免使用不必要的returnfor - 循环。修改后的版本(以防万一)为:

def sum_of_digits(i)
  input = i.to_s
  case
  when i == 0 then 0 # return zero
  when input.length == 1 then i # return i
  else
    sum = 0
    input.length.times do |index|
      sum += input[index].to_i % 10^index   
    end
    sum
  end
end

或者更好,而不是

    sum = 0
    input.length.times do |index|
      sum += input[index].to_i % 10^index   
    end
    sum

可以使用inject

    input.length.times.inject(0) do |sum, index|
      sum += input[index].to_i % 10^index   
    end
相关问题