Séquences de récurrence binaire


10

Une séquence de récurrence binaire est une séquence définie récursivement de la forme suivante:

définition de séquence de récurrence binaire

Il s'agit d'une généralisation de la x = 1, y = 2, a = [1, 1], alpha = 1, beta = 1séquence de Fibonacci ( ) et de la séquence de Lucas ( x = 1, y = 2, a = [2, 1], alpha = 1, beta = 1).

Le défi

Compte tenu n, x, y, a, alphaet beta, dans tout format raisonnable, la production ne terme de la séquence de récurrence binaire correspondant.

Règles

  • Vous pouvez choisir que la séquence soit indexée 1 ou indexée 0, mais votre choix doit être cohérent sur toutes les entrées, et vous devez noter votre choix dans votre réponse.
  • Vous pouvez supposer qu'aucune entrée non valide ne sera donnée (comme une séquence qui se termine avant nou une séquence qui fait référence à des termes non définis, comme F(-1)ou F(k)k > n). À la suite de cela, xet ysera toujours positif.
  • Les entrées et sorties seront toujours des entiers, dans les limites du type entier naturel de votre langue. Si votre langue a des entiers non bornés, les entrées et sorties seront dans la plage [2**31, 2**31-1](c'est-à-dire la plage pour un entier complément à deux signé 32 bits).
  • acontiendra toujours exactement des yvaleurs (selon la définition).

Cas de test

Remarque: tous les cas de test sont indexés 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

Est-il araisonnable de prendre un ordre inversé?
Dennis

@Dennis Oui, c'est vrai.
Mego

OK, merci d'avoir clarifié.
Dennis

Réponses:


2

Gelée , 11 octets

⁴Cịæ.⁵ṭµ¡⁶ị

Essayez-le en ligne!  1  |  2  |  3  |  4  |  5 

Comment ça fonctionne

⁴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 octets

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

Une solution récursive directe. Toutes les entrées sont extraites de STDIN, sauf en ntant qu'argument de fonction, une division qui est autorisée par défaut (mais de manière litigieuse).

Il ne semble pas y avoir de moyen d'économiser des octets and/orà la place de if/elsecar l[n]pourrait être falsey à 0.


2

Python 2, 59 octets

x,y,A,a,b,n=input()
exec'A+=a*A[-x]+b*A[-y],;'*n
print A[n]

Testez-le sur Ideone .


2

JavaScript (ES6), 51 44 octets

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

Notez que la fonction est partiellement curry, par exemple f(1,2,[1,1],1,1)(8)renvoie 34. Il en coûterait 2 octets pour rendre les fonctions intermédiaires indépendantes les unes des autres (actuellement seule la dernière fonction générée fonctionne correctement).

Edit: sauvé 7 octets grâce à @Mego soulignant que j'avais oublié que le tableau transmis contient toujours les premiers yéléments du résultat.


@Mego Je sais que j'oublie souvent les détails des questions, mais celle-ci m'a paru particulièrement subtile.
Neil

2

Haskell, 54 48 octets

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

0

J, 43 octets

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

Étant donné une séquence initiale de termes A , calcule le terme suivant n fois en utilisant les paramètres de x , y , α et β . Ensuite, il sélectionne le n ème terme dans la séquence étendue et le sort comme résultat.

Usage

Étant donné que J ne prend en charge que 1 ou 2 arguments, je regroupe tous les paramètres sous forme de liste de listes encadrées. Les valeurs initiales de départ A sont d'abord, suivies des paramètres de x et y en tant que liste, suivies des paramètres de α et β en tant que liste, et se terminant par la valeur 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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.