2016-06-30 8 views
1

ich auf Collatz Conjecture in Ruby arbeite und bei n stop = 1. Dies ist der Code, den ich bisher:Array Anfügen während in Ruby mit Rekursionsschleife

def collatz(n) 
    arr = [] 
    if n == 1 
    arr << n 
    return arr 
    elsif n % 2 == 0 
    n = n/2 
    arr << n 
    collatz(n) 
    else 
    n = (3 * n) + 1 
    arr << n 
    collatz(n) 
    end 

end 

ich den Code wollen eine Rückkehr Array aller n Werte in der Schleife. Zum Beispiel, wenn ich collatz(10) tun, mag ich es [5,16,8,4,2,1]

Momentan angezeigt wird es zeigt [1] für jeden Eingabewert. Dies liegt daran, dass nach der ersten Schleife collatz (n) aufgerufen wird und die erste Zeile arr= [] lautet, wodurch mein Array jede Schleife zurückgesetzt wird.

Wie kann ich die Methodenschleife beim Anhängen meines Arrays fortsetzen?

Antwort

0

Array hinzufügen, wie exampled params:

def collatz(arr, n) 
    if n == 1 
    arr << n 
    return arr 
    elsif n % 2 == 0 
    n = n/2 
    arr << n 
    collatz(arr, n) 
    else 
    n = (3 * n) + 1 
    arr << n 
    collatz(arr, n) 
    end 
end 

puts "#{collatz([], 10).join(', ')}" 

Ergebnis wird das gleiche, wie Sie wollen:

[5, 16, 8, 4, 2, 1, 1] 

Aber denken Sie daran: recurse ist ein Übel!

und innerhalb recurse:

def collatz(n) 
    arr = [] 
    loop do 
    n = n % 2 == 0 ? n/2 : (3 * n) + 1 
    arr << n 
    break if n == 1 
    end 
    arr 
end 

puts "#{collatz(10).join(', ')}" 
+0

hilft Warum ist recurse Übel? –

+0

Rekursiv ist böse, weil es deine Fähigkeiten mit maximalen Call-Stack-Beschränkungen einschränkt. Es (Callstack-Limit) hängt von Ihrer Sprache und Ihrem Computer ab, ist aber nicht unendlich. –

1

können Sie diesen Code verwenden.

Wenn n 1 ist, wird Array zurückgegeben. Wenn n% 2 == 0 benutze n/2 sonst benutze (3 * n) + 1. wenn n nun 1 ist, gib es zurück wie Array sonst definiere neu Array mit n wert und ruf dich mit n an.

def collatz(n) 
    return [n] if n == 1 
    n = n % 2 == 0 ? n/2 : (3 * n) + 1 
    n == 1 ? [n] : [n] + send(__method__, n) 
end 

Ausgang

p collatz(10) 
# => [5, 16, 8, 4, 2, 1] 

Ich hoffe, das