Come vieni con gli algoritmi?

1

Ho raccolto alcune domande del Project Euler oggi e ho deciso di trovare modi più efficaci per rispondere alle domande alle quali avevo già risposto.

Quindi sulla domanda su come trovare la somma dei termini pari di Fibonacci fino a 4 milioni; Ho notato che se avessimo una sequenza separata per i termini di Fibonacci pari (a partire da 0 & 2 come i primi e secondo termini rispettivamente), la progressione sarebbe [0,2,8,34,144,610,...] Se sono noti due valori di due termini successivi, il seguente termine potrebbe essere ottenuto con questa espressione:

[ T(n) = (4 * T(n-1)) + T(n-2) ]
...
Where;
T(n) : is the nth term,
T(n-1) : is the (n-1)th term,
T(n-2) : is the (n-2)th term,
and '4' is a constant.

Tuttavia, finora non sono stato in grado di ricavare un'espressione adeguata per trovare il valore in una posizione arbitraria senza conoscere i valori dei due termini precedenti.

La mia domanda:

  1. È così che vengono derivate le equazioni (/ algoritmi)?

  2. È un algoritmo efficace?

Nota: L'altro metodo meno efficiente (secondo me) è:

  1. Crea una funzione per generare tutti i numeri nella sequenza di Fibonacci inferiore a 4 milioni,

  2. Ottieni i numeri pari tra loro,

  3. Trova la loro somma.

posta Tosin Animashaun 12.07.2013 - 23:00
fonte

2 risposte

5

Una espressione in forma chiusa (chiamata formula di Binet) per i termini della sequenza di Fibonacci è ben conosciuto: Fₙ = (φⁿ-ψⁿ) / √5, dove φ = (1 + √5) / 2 e ψ = (1-√5) / 2. Potresti essere in grado di provare quella formula tramite il teorema Master per le ricorrenze. In ogni caso, esaminando la formula di Binet o calcolando numericamente i rapporti dei termini consecutivi della sequenza di Fibonacci, dovresti rapidamente osservare che Fₙ è nell'ordine di φ volte più grande di Fₙ₋₁. Poiché φ è circa 1.618, ciò implica che Fₙ cresca abbastanza rapidamente con n che presto supera i 4 milioni.

Ecco un esempio di un codice Python che calcola i valori di Fibonacci meno di un limite.

def smallFib(fmax):
    a, b = 0, 1
    while b<fmax:
        print b
        a, b = b, a+b

Esegui il codice (ovvero, inserisci il codice in un interprete python, quindi pronuncia smallFib(4000000) ) e vedrai che in realtà solo circa 33 termini della sequenza di Fibonacci sono inferiori a 4 milioni. Quindi, ha senso semplicemente fare la cosa semplice, e sommare l'11 di quei termini che sono pari. (Per verificare se un numero è pari e aggiungerlo a una somma in tal caso, puoi dire if not b&1: sum += b .)

Si noti che la formula di Binet non fornisce alcuna informazione a priori se un termine sarà pari o dispari. Ad ogni modo, ogni terzo F è pari, quindi puoi calcolare F₃, F₆, F₉ ..., ma sapere che ogni terzo Fₙ è anche necessario per ispezionare i numeri o provare qualcosa sui numeri di Fibonacci. In molti casi, l'uso di una formula chiusa leggermente complicata non è in grado di risparmiare tempo rispetto ai valori di elaborazione tramite una ricorrenza estremamente semplice.

Riepilogo: non utilizzare un approccio complicato quando si eseguirà un approccio semplice. Impara un linguaggio interpretato come python in modo che tu possa eseguire semplici test per scoprire se un approccio semplice è abbastanza buono.

    
risposta data 13.07.2013 - 02:14
fonte
3

Questo dovrebbe probabilmente essere chiuso come troppo ampio. Voglio dire, ti farò riferimento a How To Solve di Polya , che è qualcosa di classico, ma questa lista potrebbe andare avanti indefinitamente.

Un po 'più specificamente -

  1. Ordina. Sì, con un sacco di pensieri e rielaborazioni, ma mi capita di conoscere la forma chiusa per Fibonacci dal mio argomento, da quando mi sono laureato in matematica e ho lavorato su insiemi di problemi che mi hanno portato in questa direzione abbastanza da permettermi di capire grandi parti di esso per conto mio - "auto-scoperta guidata", se vuoi. Ma , come programmatore professionista, trascorri il tuo tempo non tanto su questo tipo di pensiero e di problem solving quanto fai ricerche, googlando e chiedendo in giro finché non trovi qualcosa.

  2. Esistono sicuramente modi più efficienti per farlo. È una decisione personale da parte tua se vuoi capire il più possibile da solo o cercare altri modi. La mia raccomandazione? Il primo, poi l'altro.

risposta data 13.07.2013 - 01:06
fonte

Leggi altre domande sui tag