我有这个代码应该返回一个数字的尾随零数。我应该返回时返回0的代码。不完全确定发生了什么。有人帮忙吗?
def trailing_zeros(number)
sort_sum = number.to_s.split(//).reverse
counter = 0
until sort_sum[counter] == "0"
counter += 1
return counter
end
end
---------- ------------ EDIT
我已经从我的直到循环内部删除了返回计数器,但仍然没有结果。
def trailing_zeros(number)
sort_sum = number.to_s.split(//).reverse
counter = 0
until sort_sum[counter] == "0"
counter += 1
end
return counter
end
如果我输入1200,我应该得到2,但我一直得到0
----------- -------- EDIT
嘿伙计们,我还有一个问题。所以我试图理解为什么上面的函数和我的这个新函数不起作用。def zeros(n)
trailing_zeros(n) if n == 1
zeros(n-1) * n
end
def trailing_zeros(number)
sort_sum = number.to_s.split(//).reverse
counter = 0
until sort_sum[counter] != "0"
counter += 1
end
return counter
端
放零(12)
我也一直为这个输入得零,我只是不确定为什么。起初是因为我认为尾随的零函数需要由零定义,但是我只是得到一个堆栈级别太深的错误。当我使用require pry并查看此行时:
trailing_zeros(n) if n == 1
始终将零传递给它。我感到沮丧,因为到目前为止我应该了解我的基础知识。另外一个问题。什么构成堆栈级别太深的错误?
答案 0 :(得分:2)
你不应该在你的循环中return
计数器。
让循环结束,然后返回最终的counter
。
此外,您错误地使用了until
。只要条件为 false ,until
就会执行它的正文(即puts 'a' until false
将无限运行)。你的条件是从头开始 true ,当你传递任何带尾随0的数字时(当你反转数字的字符串版本时),因此你的until
会立即退出。
为什么不尝试这样做(基于你的方法,但更多的Rubyish):
def trailing_zeros(number)
sort_sum = number.to_s.split(//).reverse
counter = 0
sort_sum.each do |num|
num == '0' ? counter += 1 : break
end
counter
end
答案 1 :(得分:2)
def trailing_zeros(number)
sort_sum = number.to_s.split(//).reverse
counter = 0
until sort_sum[counter] != "0"
counter += 1
end
counter
end
将返回移出循环 更改== 0到!= 0您希望在用完零时停止。
答案 2 :(得分:0)
sort的初始值sum [counter]可能为“0”,在这种情况下,你的循环永远不会运行,并且返回最后一个计算值,这是你将计数器初始化为0所以它是有意义的。澄清你的循环永远不会运行
答案 3 :(得分:0)
你的循环是:
until sort_sum[counter] == "0"
在数组中转换为“直到你达到0”。如果您的输入为1200,sort_sum[counter] == "0"
第一次评估为true
,则永远不会进入您的循环。
要在不使用Ruby循环的情况下执行此操作,请考虑:
def trailing_zeros(number)
number.to_s.split(//).reverse.find_index{|digit| digit != "0"}
end
找到非零数字数组中的第一个条目(参见Enumberable#find_index)。