2014-05-20 74 views
-1

我有这个代码应该返回一个数字的尾部零的数量。我的代码返回0时,它应该返回2.不太确定发生了什么。有些人帮助家伙?这个Ruby Kata为什么会返回0而不是2?

def trailing_zeros(number) 
    sort_sum = number.to_s.split(//).reverse 
    counter = 0 
    until sort_sum[counter] == "0" 
    counter += 1 
    return counter 
    end 
end 

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

我已经删除了复原计数器从我里面,直到环,仍然没有得到结果。

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)

我也不断收到此输入一个零,我只是不知道为什么。起初,这是因为我认为尾随零函数需要被零定义,但是我只是得到一个堆栈级别太深的错误。当我使用require pry并看一下这一行时:

trailing_zeros(n) if n == 1 

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

+0

在循环内使用'return counter'将在循环结束前退出该方法。 – Cereal

回答

2

您不应该在您的循环中使用return计数器。

让循环结束,然后返回最后的counter。您可能会错误地使用untiluntil只要条件为false(即puts 'a' until false将无限运行)将执行它的正文。您的条件是从一开始当您通过任何数字与尾随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 
+0

它仍然是1而不是0 – c0d3junk13

+0

如果我们可以重写我只是'编号.to_s [/ 0 * $ /]。尺寸'而不是:) –

+1

@DaniëlKnippers绝对!但作为一个“卡塔”,我不想完全改变OP的方法,只是用更多的Ruby风格来处理他的思维方式。 –

0

的那种最初的)和[计数器]可以是“0”,在这种情况下,你的循环永远不会运行,最后计算的值被返回,这是你的计数器初始化为0,所以它是有道理的。为了澄清你的循环永远不会运行

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要停止,当您用完零。

+0

这个技巧。谢谢。 –

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)。

相关问题