为什么这个Ruby Kata返回0而不是2?

为什么这个Ruby Kata返回0而不是2?,ruby,Ruby,我有一段代码,它应该返回一个数字的尾随零的数目。我的代码在应该返回2时返回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 ----------编辑------------ 我已经从我

我有一段代码,它应该返回一个数字的尾随零的数目。我的代码在应该返回2时返回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  
----------编辑------------

我已经从我的until循环中移除了返回计数器,但仍然没有得到任何结果

  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

-----------编辑--------

嘿,伙计们,我还有一个问题。所以我试图理解为什么上面的函数和这个新函数不起作用

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)

我也一直得到这个输入的零,我只是不知道为什么。起初,这是因为我认为尾部的zeros函数需要由zero定义,但后来我得到了一个堆栈级别太深的错误。当我使用require PRYLE并查看这条线时:

trailing_zeros(n) if n == 1 

零总是传递给它。我感到很沮丧,因为我现在应该知道我的基本知识了。还有一个问题。什么构成堆栈级别太深的错误?

您不应该
返回循环中的计数器

让循环完成,然后返回最终的
计数器

此外,您正在错误地使用
,直到
<代码>直到
将在条件为假时执行其主体(即
将“a”放置到假
将无限运行)。当您传递带有尾随0的任何数字时(当您反转数字的字符串版本时),您的条件是从开头true开始,因此,
直到
立即退出

为什么不试试呢(基于你的方法,但有点鲁比):

排序(sort)sum[counter]的初始值可能为“0”,在这种情况下,循环从未运行,最后一个计算值将返回,这是您将计数器初始化为0的结果,因此有意义。为了澄清你的循环从未运行过

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您希望在零用完时停止

您的循环是:

until sort_sum[counter] == "0"
转换为数组中的“直到你击中一个0”。如果输入为1200,
sort\u sum[计数器]=“0”
第一次计算为
true
,从不进入循环

要做到这一点而不在Ruby中循环,请考虑:

def trailing_zeros(number)
  number.to_s.split(//).reverse.find_index{|digit| digit != "0"}
end

它在数字数组中找到第一个不是零的条目(请参阅)。

如果我们可以重写,它仍然是1而不是0。我只需要做
数字。to_[/0*$/]。size
:)@DaniëlKnippers绝对!但是作为一个“Kata”,我不想完全改变OP的方法,只是用一种更为Ruby的风格来处理他的思维方式。在循环中使用
返回计数器
将在循环完成之前退出该方法。
def trailing_zeros(number)
  number.to_s.split(//).reverse.find_index{|digit| digit != "0"}
end