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

时间:2014-05-20 12:51:52

标签: ruby

我有这个代码应该返回一个数字的尾随零数。我应该返回时返回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 

始终将零传递给它。我感到沮丧,因为到目前为止我应该了解我的基础知识。另外一个问题。什么构成堆栈级别太深的错误?

4 个答案:

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