2015-05-30 5 views
5

Stellen Sie sich vor, Sie generieren die Fibonacci-Zahlen mit dem offensichtlichen Brute-Force-Algorithmus. Wenn ich die Anzahl der Fibonaccis weiß, dass ich im Voraus erstellt werden soll, kann ich so etwas tut die Macht Verbindung mit ^::Gibt es ein J-Idiom zum Hinzufügen zu einer Liste, bis eine bestimmte Bedingung erfüllt ist?

(, [: +/ _2&{.)^:20 i.2 

Wie kann ich statt stoppen, wenn die Fibonaccis eine Grenze erreichen, 1e6 sagen? (Ich weiß, wie man das innerhalb einer Funktion mit while. macht, aber das macht keinen Spaß.)

Ich möchte betonen, dass dies eine allgemeine Frage zu J ist, keine spezielle Frage zu Fibonacci. Lassen Sie sich nicht von Fibonacci-Zahlen ablenken. Der Kern der Frage ist, wie man sich an eine Liste anhängt, bis eine Bedingung erfüllt ist.

Antwort

3

I denke, die beste Antwort darauf ist in Henry Richs Buch J for C-Programmierer. Insbesondere verwendet es die Power Conjunction ^:. Sie können es auch verwenden, um zu konvergieren, bis keine Änderung mehr erfolgt, sodass das Limit nicht definiert werden muss. Henry verwendet das Beispiel, dass:

2 *^:(100&>@:])^:_"0 (1 3 5 7 9 11) 
128 192 160 112 144 176 

Die ^:_ Leistungsverbindungs ​​wiederholt, bis es keine Änderung gibt und die ^:(100&>@:]) Tests für das Ergebnis kleiner als 100. Wenn es dann ^: angewendet 1 und die Schleife 2* erfolgt wieder, wenn es nicht weniger als 100 ist, dann würde ^: auf 0 angewendet werden und das führt dazu, dass es nichts tut und nichts ändert und die Schleife beendet. Die Tatsache, dass es "0 als Rang verwendet, bedeutet, dass es die Doubling-Funktion 2* zu jedem von 1 3 5 7 9 11 einzeln anwenden kann.

Henry erklärt wirklich den Prozess besser als ich, so hier ist die Referenz für weitere Lektüre. http://www.jsoftware.com/help/jforc/loopless_code_iv_irregular_o.htm#_Toc191734389

+0

Mir war klar, wie man die Power-Konjunktion mit einem Verb und mit '_' verwendet, aber die Idee, sie miteinander zu kombinieren, war mir nicht eingefallen. –

6

Power hat auch a verb form u^:v^:n, wo das zweite Verb als Kontrolle verwendet werden kann. ZB: double (+:), während (n ist _) weniger als 100 (100&>):

+:^:(100&>)^:_ ] 1 
128 

+:^:(100&>)^:_ ] 3 
192 

Wie üblich, auf das Ergebnis der Leistung anzuhängen, boxen Sie das Substantiv:

+:^:(100&>)^:(<_) ] 3 
3 6 12 24 48 96 192 
+1

"Wie üblich, an das Ergebnis einer Macht anzuhängen, boxen Sie das Substantiv". Das wusste ich nicht! Mehr Ad-hoc-Polymorphismus in J. –

Verwandte Themen