Попытка закодировать двунаправленную последовательность Фибоначчи, т.е. даже отрицательные числа - PullRequest
1 голос
/ 13 июля 2020

С предложениями, следами и ошибками; я повторил код. Однако у меня все еще есть запрос:

Текущий результат: [1, -1, 2, -3, 5, 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55 , 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765]

Ожидаемый и точный результат: [5, -3, 2, -1, 1, 0, 1, 1 , 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765]

  • значение имеет правильную последовательность . каждое значение соответствует значению диапазона.

Однако - значения меняются местами. (-1) позиция имеет 5 & (-5) позиция имеет 1. Как мне ее решить?

Также, если я попробую bi_fibonacci (5,10):

Ответ: [0 , 1, 1, 2, 3, 5] - учитывается длина диапазона. независимо от значений.

Я бы хотел показать: [8, 13, 21, 34, 55] - Фактический ответ.

Как решить?

Заранее спасибо.

def bi_fibonacci(num1, num2):
    a = 1
    b = -1
    for item in range(num1, num2+1):
        if item < 0:
            yield a
            temp = a
            a = b
            b = temp - b

    a = 0
    b = 1
    for item in range(num1,num2+1):
        if item > -1:
            yield a
            temp = a
            a = b
            b = temp + b

fibo_seq = [x for x in bi_fibonacci(-8,8)]
print(fibo_seq)
print(len(fibo_seq))

1 Ответ

0 голосов
/ 16 июля 2020

Во-первых, я считаю, что вам нужен стек для отрицательной последовательности Фибоначчи. Либо явный стек (например, list), либо неявный (например, рекурсия). Во-вторых, вам необходимо провести тщательный учет этой проблемы. Рассмотрим эти три случая:

sequence = bi_fibonacci(-10, -5)
sequence = bi_fibonacci(-10, 10)
sequence = bi_fibonacci(5, 10)

Вы хотите правильно обработать все три случая, но не делать какой-либо из них особым случаем. Ниже мое решение с использованием явного стека

# ..., −8, 5, −3, 2, −1, 1, 0, 1, 1, 2, 3, 5, 8, ...

def bi_fibonacci(num1, num2):

    n = -1
    a = 1
    b = 0

    stack = []

    while n >= num1:
        if n <= num2:
            stack.append(a)

        a, b = b - a, a

        n -= 1

    if stack:
        yield from reversed(stack)

    n = 0
    a = 0
    b = 1

    while n <= num2:
        if n >= num1:
            yield a

        a, b = b, a + b

        n += 1

sequence = bi_fibonacci(-10, -5)
print(*sequence, sep=', ')

sequence = bi_fibonacci(-10, 10)
print(*sequence, sep=', ')

sequence = bi_fibonacci(5, 10)
print(*sequence, sep=', ')

OUTPUT

> python3 test.py
-55, 34, -21, 13, -8, 5
-55, 34, -21, 13, -8, 5, -3, 2, -1, 1, 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55
5, 8, 13, 21, 34, 55
>
...