2015-05-30 14 views
5

Wyobraź sobie, że generujesz liczby Fibonacciego za pomocą oczywistego, brutalnego algorytmu. Jeśli wiem liczbę Fibonaccis Chcę, aby wygenerować z góry, mogę zrobić coś takiego za pomocą spójnika zasilania ^::Czy istnieje idiom J do dodawania do listy, dopóki nie zostanie spełniony określony warunek?

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

Jak mogę zamiast zatrzymać kiedy Fibonaccis osiągnąć pewną granicę, powiedzieć 1e6? (Wiem, jak to zrobić w funkcji używającej while., ale to nie jest zabawne.)

Chcę podkreślić, że jest to ogólne pytanie o J, a nie konkretne pytanie dotyczące Fibonacciego. Nie rozpraszaj się numerami Fibonacciego. Głównym pytaniem jest, jak zachować dołączanie do listy, dopóki nie zostanie spełniony jakiś warunek.

Odpowiedz

3

I uważam, że najlepszą odpowiedzią jest książka Henry'ego Richa J dla programistów C. W szczególności, używając Konwersji mocy ^:. Możesz także użyć go, by zbiegać, dopóki nie zmieni się, tak, że limit nie będzie musiał być zdefiniowany. Henry wykorzystuje przykład, że:

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

koniunkcji ^:_ Moc powtarza dopóki nie nastąpi zmiana i ^:(100&>@:]) testy dla wyniku jest mniejsza niż 100. Jeśli jest następnie ^: nakłada się 1 i pętla 2* odbywa ponownie, jeśli nie jest mniejszy niż 100, wówczas ^: zostanie zastosowany do 0, a to spowoduje, że nie zrobi nic i nic się nie zmieni, a pętla się zakończy. Fakt, że używa on numeru "0 jako rankingu, oznacza, że ​​może on zastosować funkcję podwojenia 2* osobno dla każdego z .

Henry naprawdę wyjaśnia proces lepiej niż ja, więc tutaj jest odniesienie do dalszego czytania. http://www.jsoftware.com/help/jforc/loopless_code_iv_irregular_o.htm#_Toc191734389

+0

Byłem świadomy, jak używać potęgi koniunkcji z czasownikiem i "_", ale pomysł połączenia ich razem nie przyszedł mi do głowy. –

6

Moc ma również a verb form u^:v^:n, gdzie drugi czasownik może być używany jako czek. Np: podwójne (+:) while (n jest _) mniej niż 100 (100&>):

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

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

Jak zwykle, aby dołączyć do wyniku siły, to pole rzeczownika:

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

"Jak zwykle, aby dołączyć do wyniku mocy, należy wpisać rzeczownik". Nie wiedzialam tego! Więcej polimorfizmu ad hoc w J. –