2015-05-30 10 views
5

Immagina di generare i numeri di Fibonacci usando l'ovvio algoritmo a forza bruta. Se conosco il numero di Fibonaccis voglio generare in anticipo, posso fare qualcosa di simile utilizzando la congiunzione potere ^::Esiste un idioma J per l'aggiunta a un elenco fino a quando non viene soddisfatta una determinata condizione?

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

Come posso invece fermarsi quando le Fibonaccis raggiungere un qualche limite, diciamo 1e6? (So ​​come farlo all'interno di una funzione usando while., ma non è divertente.)

Voglio sottolineare che questa è una domanda generale su J, non una domanda specifica su Fibonacci. Non farti distrarre dai numeri di Fibonacci. Il cuore della domanda è come continuare ad aggiungersi a una lista finché non viene soddisfatta una condizione.

risposta

3

I pensa che la migliore risposta sia nel programmatore J for C di Henry Rich. In particolare, utilizza la Power Conjunction ^:. Puoi anche usarlo per convergere fino a quando non ci sono cambiamenti, in modo che il limite non debba essere definito. Henry usa l'esempio che:

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

la congiunzione ^:_ Potenza ripete fino a quando non v'è alcun cambiamento e le ^:(100&>@:]) test per il risultato è inferiore a 100. Se è allora ^: viene applicato al 1 e il ciclo 2* è fatto di nuovo, se non è inferiore a 100 allora ^: verrebbe applicato a 0 e tale risultato non farà nulla e non cambierà nulla e il ciclo si interromperà. Il fatto che utilizzi "0 come rango significa che può applicare individualmente la funzione di raddoppio 2* a ciascuno di 1 3 5 7 9 11.

Henry spiega davvero il processo meglio di me, quindi ecco il riferimento per ulteriori letture. http://www.jsoftware.com/help/jforc/loopless_code_iv_irregular_o.htm#_Toc191734389

+0

Ero consapevole di come usare la congiunzione di potenza con un verbo e con '_', ma l'idea di combinarli insieme non mi era venuta in mente. –

6

L'alimentazione ha anche a verb form u^:v^:n dove il secondo verbo può essere utilizzato come controllo. Ad esempio: doppio (+:) mentre (n è _) inferiore a 100 (100&>):

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

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

Come al solito, per aggiungere al risultato del potere, si Box il sostantivo:

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

"Come al solito, per aggiungere al risultato di un potere, si inserisce il nome". Non lo sapevo! Più polimorfismo ad hoc in J. –

Problemi correlati