Sequências binárias de recorrência

10

Uma sequência de recorrência binária é uma sequência definida recursivamente da seguinte forma:

definição de sequência de recorrência binária

Esta é uma generalização da x = 1, y = 2, a = [1, 1], alpha = 1, beta = 1sequência de Fibonacci ( ) e da sequência de Lucas ( x = 1, y = 2, a = [2, 1], alpha = 1, beta = 1).

O desafio

Dado n, x, y, a, alpha, e beta, em qualquer formato razoável, de saída do nésimo termo da sequência de recorrência binário correspondente.

Regras

  • Você pode escolher que a sequência seja indexada 1 ou 0, mas sua escolha deve ser consistente em todas as entradas e você deve fazer anotações de sua escolha em sua resposta.
  • Você pode assumir que nenhuma entrada inválida seria fornecida (como uma sequência que termina antes de nou uma sequência que faz referência a termos indefinidos, como F(-1)ou F(k)onde k > n). Como resultado disso, xe ysempre será positivo.
  • As entradas e saídas sempre serão números inteiros, dentro dos limites do tipo inteiro natural do seu idioma. Se o seu idioma tiver números inteiros ilimitados, as entradas e saídas estarão dentro do intervalo [2**31, 2**31-1](ou seja, o intervalo para um inteiro de complemento de dois com sinal de 32 bits).
  • asempre conterá exatamente yvalores (conforme a definição).

Casos de teste

Nota: todos os casos de teste são indexados em 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
Mego
fonte
Será que tomar ana contagem invertida ordem como razoável?
Dennis
@ Dennis Sim, ele faz.
Mego
OK, obrigado por esclarecer.
Dennis

Respostas:

2

Gelatina , 11 bytes

⁴Cịæ.⁵ṭµ¡⁶ị

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

Como funciona

⁴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.
Dennis
fonte
2

Python 2, 62 bytes

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

Uma solução recursiva direta. Todas as entradas são obtidas do STDIN, exceto ncomo argumento de função, uma divisão que é permitida por padrão (embora contenciosa).

Não parece haver uma maneira de salvar bytes and/orno lugar if/elseporque l[n]poderia ser falsey como 0.

xnor
fonte
2

Python 2, 59 bytes

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

Teste em Ideone .

Dennis
fonte
2

JavaScript (ES6), 51 44 bytes

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

Observe que a função é parcialmente com curry, por exemplo, f(1,2,[1,1],1,1)(8)retorna 34. Custaria 2 bytes para tornar as funções intermediárias independentes umas das outras (atualmente, apenas a última função gerada funciona corretamente).

Edit: Salvo 7 bytes graças ao @Mego, indicando que eu tinha esquecido que a matriz passada sempre contém os primeiros yelementos do resultado.

Neil
fonte
@Mego Eu sei que muitas vezes ignoro detalhes de perguntas, mas essa me pareceu particularmente sutil.
194 Neil
2

Haskell, 54 48 bytes

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

J, 43 bytes

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

Dada uma sequência inicial dos termos A , calcula o próximo termo n vezes usando os parâmetros de x , y , α e β . Posteriormente, ele selecciona o n th prazo na sequência e saídas estendida-lo como o resultado.

Uso

Como J suporta apenas 1 ou 2 argumentos, agrupo todos os parâmetros como uma lista de listas em caixas. A semente inicial valores Um são em primeiro lugar, seguido pelos parâmetros de x e y , como uma lista, seguido por parâmetros de α e β como uma lista, e terminando com o valor de 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
milhas
fonte