Как я могу кодировать последовательности Фибоначчи, которые включают два входа, один определяет правило, а другой определяет количество произведенных чисел? - PullRequest
0 голосов
/ 24 мая 2019

У меня есть новый вопрос относительно последовательности Фибоначчи, которая является своего рода уникальной. Он включает два входа M и N и выглядит так:

Пример:

2-Fibonacci sequence: {1, 1, 2, 3, 5, 8, 13, ...} 
3-Fibonacci sequence: {1, 1, 2, 4, 7, 13, 24, ...}

Мне нужно закодировать функцию Python, которая может распечатать первые M элементов последовательности N-Фибоначчи.

Например:

Input → N=3; M=5 Output →1 1 2 4 7
Input → N=2; M=7 Output →1 1 2 3 5 8 13

Я был бы очень признателен за любую помощь

Ответы [ 3 ]

0 голосов
/ 24 мая 2019

Поскольку с генератором это забавная проблема, вот решение генератора:

from collections import deque
def fib(return_size, last_x=2):
    def fib_gen(sum_last_x_elements):
        last = deque(maxlen=sum_last_x_elements)
        last.append(1) # Prime our fib sequence
        while True:
            yield last[-1] # peek at the right item and return it
            last.append(sum(last)) # Sum up our queue and add it to end
    gen = fib_gen(last_x) # Create generator
    return [next(gen) for _ in range(return_size)] # Create return list.

print(fib(9, 3)) # Output: [1, 1, 2, 4, 7, 13, 24, 44, 81]
0 голосов
/ 25 мая 2019

Вместо того, чтобы управлять двумя переменными (a, b) и суммировать их, используйте сам результирующий список и суммируйте последние N элементов, чтобы добавить каждый новый:

def fibo(N,M):
    result  = [1]
    for i in range(M-1):
        result.append(sum(result[-N:]))
    return result

Вы можете обобщить это еще большеприняв функцию или лямбду, которая вычисляет следующее значение на основе ряда на данный момент:

def series(N,getNext,init=[1]):
    result  = init
    for i in range(N-len(init)):
        result.append(getNext(result))
    return result

series(10,lambda r:sum(r[-2:]))             # [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
series(10,lambda r:sum(r[-2:]),init=[5,-3]) # [5, -3, 2, -1, 1, 0, 1, 1, 2, 3]
series(10,lambda r:sum(r[-3:]))             # [1, 1, 2, 4, 7, 13, 24, 44, 81, 149]
series(10,lambda r:r[-1]*2)                 # [1, 2, 4, 8, 16, 32, 64, 128, 256, 512]
series(10,lambda r:r[-2]-r[-1],init=[-1,1]) # [-1, 1, -2, 3, -5, 8, -13, 21, -34, 55]
0 голосов
/ 24 мая 2019
n = int(input("sequence: "))
m = int(input("amount of numbers: "))
numbers = [1, 1]
for i in range(n-2):
    numbers.append(sum(numbers))
for num in numbers:
    print(num)
for i in range(m-len(numbers)):
    numbers.append(sum(numbers))
    print(numbers[-1])
    numbers.pop(0)

Если я правильно вас понял, это то, что вы ищете.

...