2017-04-22 24 views
0

我tryng做這個練習:Codewars運動「的次數X」不工作

創建帶有兩個參數的函數將返回長度 (n)的列表與倍數(X) 。

假設兩個給定數量和次數進行計數將是 正數大於0

返回結果作爲數組(或列表在Python,Haskell中或酏劑)更大。

例子:

count_by(1,10) #should return [1,2,3,4,5,6,7,8,9,10] 
count_by(2,5) #should return [2,4,6,8,10] 

很容易,沒什麼可說的。但我真的不明白爲什麼我的代碼無法正常工作。 請不要給我新的代碼或解決方案,我只是想了解爲什麼礦難不起作用。

我的解決辦法:

def count_by(x, n) 
    arrays = [] 
    arrays.push(x) 
    valore_x = x 

    unless arrays.count == n 
    arrays.push(x + valore_x) 
    x += valore_x 
    end 

    return arrays 
end 

count_by(3, 5) 

錯誤信息=

Expected: [1, 2, 3, 4, 5], instead got: [1, 2] 
✘ Expected: [2, 4, 6, 8, 10], instead got: [2, 4] 
✘ Expected: [3, 6, 9, 12, 15], instead got: [3, 6] 
✘ Expected: [50, 100, 150, 200, 250], instead got: [50, 100] 
✘ Expected: [100, 200, 300, 400, 500], instead got: [100, 200]. 

所以看起來像我的代碼不要把所有的數字。謝謝。

回答

2

變化

unless arrays.count == n 

until arrays.count == n 

unless不是一個循環。它就像一個if,但是如果條件爲false,代碼將被執行。 until就像while,但代碼在條件爲false時執行。

+0

真是太可惜了,我只是直到不知所措。謝謝>。>。 –

+0

我想象中。我的榮幸爵士:) – Ursus

+0

_「..執行,直到條件爲假」_應該說_「直到條件爲真」_? –

2

現在你已經回答你的問題,所以我只是建議的解決方案多一個變種,我認爲這是更紅寶石路:)

def count_by(x, y) 
    y.times.with_object([]) do |i, result| 
    result << x*(i+1) 
    end 
end 
0

就在幾個其他的方式來達到同樣的效果。使用Numeric#step

x.step(by: x, to: x*y).entries 

較短,但較少可讀:

x.step(x*y, x).entries 

或使用範圍內具有Range#step

(x..x*y).step(x).entries 

在各實施例中entries可以與to_a

1
被替換

Array::new可以在這裏使用。

def count_by(x, n) 
    Array.new(n) { |i| x*(i+1) } 
end 

count_by(1,5) #=> [1, 2, 3, 4, 5] 
count_by(2,5) #=> [2, 4, 6, 8, 10] 
count_by(3,5) #=> [3, 6, 9, 12, 15] 
count_by(50,5) #=> [50, 100, 150, 200, 250] 
count_by(100,5) #=> [100, 200, 300, 400, 500] 
count_by(0,5) #=> [0, 0, 0, 0, 0]