2014-05-20 113 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)。

相關問題