2016-05-12 7 views
0

Ich versuche zu zählen, wie oft die Methode während der Laufzeit des Programms rekursiv ist. Der folgende Code erhält das gewünschte Ergebnis, verwendet jedoch globale Variablen. Gibt es einen Weg um diesen oder einen besseren Weg?Ruby-Rekursionszähler ohne globale Variable

$count = 0 
def AdditivePersistence(num) 
    return 0 if num.to_s.length == 1 
    numarr = num.to_s.chars.map!(&:to_i) 
    i = numarr.inject(&:+) 
    $count+=1 
    if i.to_s.length!=1 
    AdditivePersistence(i) 
    end 
    $count 
end 

Antwort

0

Sie könnten mit der ersten Variablen in der Anordnung in einem Array nehmen num zu sein und dann die zweite die count zu sein. dann tun Sie einfach return [num, count]

0

Eine andere Möglichkeit wäre, Ihre Methodendefinition zu aktualisieren, um den Zähler als Argument zu akzeptieren.

Mit dieser Methode kann die Methode den Zählerwert, den sie empfängt, einfach erhöhen und dann den Wert inkrementiert im rekursiven Aufruf übergeben.

def AdditivePersistence(num, counter) 
    return 0 if num.to_s.length == 1 
    numarr = num.to_s.chars.map!(&:to_i) 
    i = numarr.inject(&:+) 
    counter +=1 
    if i.to_s.length!=1 
    AdditivePersistence(i, counter) 
    end 
    counter 
end 
# usage 
AdditivePersistence(12, 0) 
+0

Dies entspricht nicht der OP-Version. Ihre Version zählt die tiefste Rekursionsstufe separat für jeden einzelnen Aufruf von 'AdditionalPersistence'. Die Version des OP zählt die * laufende Summe * aller * rekursiven Aufrufe während der gesamten Laufzeit des Programms. Also, wenn ich * deine * Version zweimal mit '1234' als Argument anrufe, gibt es beide Male" 2 "zurück, während die OP's Version beim ersten Mal' 2' und beim zweiten Mal '4' zurückgibt. –

1

Da die Gesamtzahl der rekursiven Aufrufe während der Laufzeit des Programms wollen, eine globale Variable in irgendeiner Form ist der einzige Weg, es zu tun. Sie können entweder eine explizite globale Variable verwenden, wie Sie es getan haben, oder eine globale Variable in der Verkapselung, z. B. eine Singleton-Klasse oder eine Thread-lokale Variable. Ich werde diese hier nicht darstellen, da sie für diesen Anwendungsfall einfachen globalen Variablen unterlegen sind.