Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 28, 2022 17:00:24

SpyBorgFly
Зарегистрирован: 2022-12-26
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Нужна помощь в оптимизации не очень сложной задачки

 def Fibonachi(n):
    if n == 1:
        return 1
    if n == 2:
        return 1
    if n > 2:
        return Fibonachi(n - 2) + Fibonachi(n - 1)
def productFib(prod):
    answer = []
    for n in range(1, 50):
        if prod == Fibonachi(n) * Fibonachi(n+1):
            return [Fibonachi(n), Fibonachi(n+1), True]
            break
        if prod != Fibonachi(n) * Fibonachi(n+1) and ((Fibonachi(n) * Fibonachi(n+1)) < prod) :
            answer.append(Fibonachi(n+1))
            answer.append(Fibonachi(n+2))
            continue
        return [answer[-2], answer[-1], False]

Задача с кодварса 5 кю . https://www.codewars.com/kata/5541f58a944b85ce6d00006a
Набросал такой код, тесты проходит но как я понял выходит из строя на тестах с большими числами(Execution Timed Out (12000 ms)). Так что нужна оптимизация.
Кому лень читать с сайта, тогда условия задачи вкратце

на вход дается число, если это число равняется какому то n фибоначи * n+1 фибоначи нужно вывести
n фибоначи, n+1 фибоначи, True

в противном случае алгоритм такой:
productFib(800) # should return (34, 55, false),
# since F(8) = 21, F(9) = 34, F(10) = 55 and 21 * 34 < 800 < 34 * 55

Прошу помочь c для оптимизацией
Еще есть такой вариант кода
 def Fibonachi(n):
    if n == 1:
        return 1
    if n == 2:
        return 1
    if n > 2:
        return Fibonachi(n - 2) + Fibonachi(n - 1)
def productFib(prod):
    answer = []
    n = 1
    while Fibonachi(n) * Fibonachi(n+1) < prod:
        n += 1
        if prod == Fibonachi(n) * Fibonachi(n + 1):
            return [Fibonachi(n), Fibonachi(n + 1), True]
            break
    if Fibonachi(n) * Fibonachi(n+1) > prod:
        return [Fibonachi(n), Fibonachi(n+1), False]

Отредактировано SpyBorgFly (Дек. 28, 2022 18:08:22)

Офлайн

#2 Дек. 28, 2022 19:59:01

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

Нужна помощь в оптимизации не очень сложной задачки

SpyBorgFly
выходит из строя на тестах с большими числами
Сделай функцию для поиска числа Фибоначчи не через рекурсию, а через цикл.



Офлайн

#3 Дек. 29, 2022 00:30:45

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Нужна помощь в оптимизации не очень сложной задачки

 import itertools
def Fibonacci(a, b):
    while True:
        yield a
        a, b = b, a + b
def productFib():
    count = 0
    for a, b in itertools.islice(zip(Fibonacci(0, 1), Fibonacci(1, 1)), 2, None):
        print(f'example: {count} ~ {a, b}')
        count += 1
        if count > 10:
            return
'''
example: 0 ~ (1, 2)
example: 1 ~ (2, 3)
example: 2 ~ (3, 5)
example: 3 ~ (5, 8)
example: 4 ~ (8, 13)
example: 5 ~ (13, 21)
example: 6 ~ (21, 34)
example: 7 ~ (34, 55)
example: 8 ~ (55, 89)
example: 9 ~ (89, 144)
example: 10 ~ (144, 233)
'''
    



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Отредактировано AD0DE412 (Дек. 29, 2022 01:05:53)

Офлайн

#4 Дек. 29, 2022 17:09:46

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1308
Репутация: +  112  -
Профиль   Отправить e-mail  

Нужна помощь в оптимизации не очень сложной задачки

  
def f():
    memory = 0
    a = 0
    b = 1
    def process(n):
        nonlocal a, b, memory
        if n < memory:
            a, b = 0, 1
        memory = n
        while True:
            if a * b == n:
                return a, b, True
            elif a * b > n:
                return a, b, False
            a, b = b, a + b
    return process
productFib = f()
for i in (0, 8, 13, 40, 800, 714, 1000, 1870, 2000):
    print(productFib(i))

Отредактировано xam1816 (Дек. 29, 2022 17:17:48)

Офлайн

#5 Дек. 29, 2022 17:57:33

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Нужна помощь в оптимизации не очень сложной задачки

эээ фабричные функции … тоже в эту сторону думалось но чет итератор захотелось сделать … у вас неплохо получилось получилось



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Отредактировано AD0DE412 (Дек. 29, 2022 18:05:59)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version