Sequenze di ricorrenza binaria


10

Una sequenza di ricorrenza binaria è una sequenza definita ricorsivamente nella seguente forma:

definizione della sequenza di ricorrenza binaria

Questa è una generalizzazione della x = 1, y = 2, a = [1, 1], alpha = 1, beta = 1sequenza di Fibonacci ( ) e della sequenza di Lucas ( x = 1, y = 2, a = [2, 1], alpha = 1, beta = 1).

La sfida

Proposta n, x, y, a, alpha, e beta, in qualsiasi formato ragionevole, uscita nesimo termine della corrispondente sequenza ricorrenza binaria.

Regole

  • Puoi scegliere che la sequenza sia 1-indicizzata o 0-indicizzata, ma la tua scelta deve essere coerente su tutti gli input e devi prendere nota della tua scelta nella tua risposta.
  • Si può presumere che non verrebbero forniti input non validi (come una sequenza che termina prima no una sequenza che fa riferimento a termini indefiniti, come F(-1)o F(k)dove k > n). Di conseguenza, xe ysarà sempre positivo.
  • Gli input e gli output saranno sempre numeri interi, entro i limiti del tipo intero naturale della tua lingua. Se la tua lingua ha numeri interi senza limiti, gli input e gli output saranno all'interno dell'intervallo [2**31, 2**31-1](ovvero l'intervallo per un intero di complemento a due bit con segno a 32 bit).
  • aconterrà sempre esattamente i yvalori (come da definizione).

Casi test

Nota: tutti i casi di test sono indicizzati 0.

x = 1, y = 2, a = [1, 1], alpha = 1, beta = 1, n = 6 => 13
x = 1, y = 2, a = [2, 1], alpha = 1, beta = 1, n = 8 => 47
x = 3, y = 5, a = [2, 3, 5, 7, 11], alpha = 2, beta = 3, n = 8 => 53
x = 1, y = 3, a = [-5, 2, 3], alpha = 1, beta = 2, n = 10 => -67
x = 5, y = 7, a = [-5, 2, 3, -7, -8, 1, -9], alpha = -10, beta = -7, n = 10 => 39

Prendere ain ordine inverso conta come ragionevole?
Dennis,

@Dennis Sì, lo fa.
Mego

OK, grazie per il chiarimento.
Dennis,

Risposte:


2

Gelatina , 11 byte

⁴Cịæ.⁵ṭµ¡⁶ị

Provalo online!  1  |  2  |  3  |  4  |  5 

Come funziona

⁴Cịæ.⁵ṭµ¡⁶ị  Main link. Arguments: a; [x, y]; [α, β]; n (1-based)

       µ     Combine the links to the left into a chain.
        ¡    Execute that chain n times, updating a after each execution.
⁴              Yield [x, y].
 C             Complement; yield [1 - x, 1 - y].
  ị            Retrieve the elements of a at those indices.
               Indexing is 1-based and modular in Jelly, so this retrieves
               [a[-x], a[-y]] (Python syntax).
     ⁵         Yield [α, β].
   æ.          Take the dot product of [a[-x], a[-y]] and [α, β].
         ⁶   Yield n.
          ị  Retrieve the element of a at index n.

2

Python 2, 62 byte

x,y,l,a,b=input();f=lambda n:l[n]if n<y else a*f(n-x)+b*f(n-y)

Una soluzione ricorsiva diretta. Tutti gli input sono presi da STDIN ad eccezione di ncome argomento di funzione, una divisione consentita per impostazione predefinita (sebbene controversa).

Non sembra esserci un modo per salvare i byte al and/orposto di if/elseperché l[n]potrebbe essere false come 0.



2

JavaScript (ES6), 51 44 byte

(x,y,z,a,b)=>g=n=>n<y?z[n]:a*g(n-x)+b*g(n-y)

Si noti che la funzione è parzialmente curry, ad es. f(1,2,[1,1],1,1)(8)Restituisce 34. Il costo sarebbe di 2 byte per rendere indipendenti le funzioni intermedie l'una dall'altra (attualmente solo l'ultima funzione generata funziona correttamente).

Modifica: salvato 7 byte grazie a @Mego sottolineando che avevo trascurato che l'array passato contiene sempre i primi yelementi del risultato.


@Mego So che spesso trascuro i dettagli delle domande, ma quello mi è sembrato particolarmente sottile.
Neil,

2

Haskell, 54 48 byte

l@(x,y,a,p,q)%n|n<y=a!!n|k<-(n-)=p*l%k x+q*l%k y

0

J, 43 byte

{:{](],(2>@{[)+/ .*]{~1-@>@{[)^:(3>@{[)>@{.

Data una sequenza iniziale di termini A , calcola il termine successivo n volte utilizzando i parametri di x , y , α e β . Successivamente, seleziona il n esimo termine della sequenza estesa e l'emette come risultato.

uso

Poiché J supporta solo 1 o 2 argomenti, raggruppo tutti i parametri come un elenco di elenchi in scatola. Il seme iniziale valori A sono primo, seguito dai parametri di x ed y come un elenco, seguiti dai parametri α e β come una lista, e termina con il valore n .

   f =: {:{](],(2>@{[)+/ .*]{~1-@>@{[)^:(3>@{[)>@{.
   2 3 5 7 11;3 5;2 3;8
┌──────────┬───┬───┬─┐
│2 3 5 7 11│3 5│2 3│8│
└──────────┴───┴───┴─┘
   f 2 3 5 7 11;3 5;2 3;8
53
   f _5 2 3 _7 _8 1 _9;5 7;_10 _7;10
39
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.