我试图创建一个递归方法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
谢谢!
答案 0 :(得分:1)
字符串索引在ruby中基于零。问题出在这里:
for n in 1..input.length
应该写成
for n in 0..input.length-1
顺便说一下,调用chr
也是多余的,因为你已经有一个数字的字符串表示。同样,sum
必须提前声明并设置为零。
此外,整个代码不是ruby惯用语:应该避免使用不必要的return
和for
- 循环。修改后的版本(以防万一)为:
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