2013-08-04 110 views
1

我試圖找到這個collat​​z序列的長度。如果我將test_array << number更改爲puts number,我可以輸出序列中的每個數字,但出於某種原因,我無法在將新值返回給該函數之前將此數字推入數組。任何幫助將非常感激。爲什麼我不能將函數參數推入數組中?

test_array = [] 

def collatz_sequence(number) 
    return number if number==1 
    if number%2==0 
    test_array << number 
    return collatz_sequence(number/2) 
    else 
    test_array << number 
    return collatz_sequence(3*number+1) 

end 
end 

puts collatz_sequence(13) 

回答

1

的局部變量不能拿一個範圍超出方法定義。改用實例變量。

@test_array = [] 

def collatz_sequence(number) 
    return 1 if number == 1 
    @test_array << number 
    collatz_sequence(number.even? ? number/2 : 3 * number + 1) 
end 

collatz_sequence(13) # => 1 
@test_array # => [13, 40, 20, 10, 5, 16, 8, 4, 2] 

但是我在結尾處看到1沒有看到太多的意思。包括在@test_array更有意義:

@test_array = [] 

def collatz_sequence(number) 
    @test_array << number 
    collatz_sequence(number.even? ? number/2 : 3 * number + 1) unless number == 1 
end 

collatz_sequence(13) 
@test_array # => [13, 40, 20, 10, 5, 16, 8, 4, 2, 1] 

但是,這不是一個很好的做法,因爲陣列和方法的程序有依賴性。一個更好的辦法來做到這一點是:

def collatz_sequence(number, test_array = []) 
    return if number == 1 
    collatz_sequence(number.even? ? number/2 : 3 * number + 1, test_array) 
end 

collatz_sequence(13) 
+0

謝謝大家!我接受了這個答案,因爲它是最長的,但每個人都很有幫助。非常感謝! – hirokibutterfield

2

test_array = []超出範圍。 def創建一個新的作用域,因此您無法從該方法內訪問test_array的值。解決此

一種方法是使test_array一個實例變量:@test_array

1

這個怎麼實現:

def collatz_sequence(number) 
     array = [number] 
     if number%2==0 
     array += collatz_sequence(number/2) 
     elsif number != 1 
     array += collatz_sequence(3*number+1) 
     end 
     return array 
    end 

    puts collatz_sequence(13) 
相關問題