Iterate über eine unendliche Sequenz in Ruby

7

Ich versuche das Projekt Euler Problem # 12 zu lösen:

  

Die Reihenfolge der Dreieckszahlen wird durch Addition der natürlichen Zahlen erzeugt   Zahlen. Also die 7. Dreieckszahl   wäre 1 + 2 + 3 + 4 + 5 + 6 + 7 =   28. Die ersten zehn Begriffe wären:

%Vor%      

Lassen Sie uns die Faktoren der ersten sieben Dreieckszahlen auflisten:

%Vor%      

Wir können sehen, dass 28 die erste Dreieckszahl über fünf ist   Teiler.   Welchen Wert hat die erste Dreieckszahl über fünf?   hundert Teiler?

Hier ist die Lösung, die ich mit Ruby entwickelt habe:

%Vor%

Ich sollte keine beliebig große Zahl wie 9_999_999_999_999_999 verwenden. Es wäre besser, wenn wir wie einige funktionale Sprachen eine Math.INFINITY-Sequenz hätten. Wie kann ich in Ruby eine faule unendliche Sequenz erzeugen?

    
nikhil 16.06.2011, 14:14
quelle

8 Antworten

8

In Ruby & gt; = 1.9 können Sie ein Enumerator-Objekt erstellen, das die gewünschte Sequenz liefert. Hier ist eine, die eine unendliche Folge von ganzen Zahlen ergibt:

%Vor%

Oder:

%Vor%

Programming Ruby 1.9 (aka "The Pickaxe Book"), 3. Platz. ed., p. 83, hat ein Beispiel eines Enumerators für Dreieckszahlen. Es sollte einfach sein, den obigen Enumerator zu modifizieren, um Dreieckszahlen zu erzeugen. Ich würde es hier tun, aber das würde das Beispiel wörtlich reproduzieren, wahrscheinlich mehr als "faire Verwendung" erlaubt.

    
Wayne Conrad 16.06.2011, 14:31
quelle
9

Mehrere Antworten sind nahe, aber ich sehe niemanden, der unendliche Bereiche benutzt. Ruby unterstützt sie gut.

%Vor%

In Ihrem Fall

%Vor%

Ihre Brute-Force-Methode ist grob und kann möglicherweise sehr lange dauern.

    
Jonas Elfström 16.06.2011 15:08
quelle
7

Infinity ist für Float (Ruby 1.9)

definiert %Vor%     
steenslag 16.06.2011 14:47
quelle
5

Aktuelle Versionen von Ruby unterstützen Generatoren stark:

%Vor%     
steenslag 16.08.2016 09:55
quelle
3

Dies wäre am besten als einfache Schleife.

%Vor%     
Amadan 16.06.2011 14:19
quelle
3

Wie Amadan erwähnt hat, können Sie Closures verwenden:

%Vor%

Ich glaube nicht, dass es viel langsamer ist als eine Schleife. Sie können den Status auch im Klassenobjekt speichern, aber Sie müssen mehr eingeben:

%Vor%

Hinzugefügt:

Für diejenigen, die longjmps mögen:

%Vor%     
Victor Moroz 16.06.2011 14:38
quelle
2

Aufbauend auf Waynes ausgezeichneter Antwort und in dem Ruby-Geist, Dinge mit der geringsten Anzahl an Charakteren hier zu tun, ist eine leicht aktualisierte Version:

%Vor%

Offensichtlich löst das ursprüngliche Euler-Problem nicht, ist aber gut zum Erzeugen einer unendlichen Folge von ganzen Zahlen. Funktioniert definitiv für Ruby & gt; 2.0. Viel Spaß!

    
cpt_peter 12.10.2015 05:36
quelle
1

Ich glaube, dass Fasern (in Ruby 1.9 hinzugefügt, glaube ich) in der Nähe von was Sie wollen. Sehen Sie hier nach, um Informationen zu erhalten oder einfach nach Ruby zu suchen Fasern

    
Jackson 16.06.2011 14:50
quelle

Tags und Links