Форум » Рекурсивные процедуры и функции » № 16 (№ 3821) » Ответить

№ 16 (№ 3821)

uchitelka: Помогите разобраться, почему программа для решения этой задачи в итоге ничего не выводит? [quote] № 16 (№ 3821) Алгоритм вычисления значения функции F(n), где n – целое число, задан следующими соотношениями: F(n) = 1, при n < 2, F(n) = F(n/3) - 1, когда n ≥ 2 и делится на 3, F(n) = F(n - 1) + 17, когда n ≥ 2 и не делится на 3. Назовите минимальное значение n, для которого F(n) равно 110.[/quote] Мой код программы: [pre2] def f(n): a = [0,1] for i in range (2,n+1): if i>=2 and i%3==0: a.append(a[i//3]-1) else: a.append(a[i-1]+17) return(a[n]) for j in range(1,100000): print(f(j)) if f(j)==110: print(j) break[/pre2] Попробовала написать другим способом по аналогии ege16 № 80 (нашла здесь среди обсуждений), но всё равно ничего не выводится... [pre2] def F(n, nest = 0): if nest > 100: return None if n < 2: return 1 if n % 3 == 0: f1 = F(n//3 - 1, nest + 1) return f1 if f1 != None else None else: f1 = F((n - 1)+17, nest + 1) return f1 if f1 != None else None n = 1 while True: r = F(n) if r != None and r == 110: print(n) break n += 1 [/pre2]

Ответов - 2

cabanov.alexey: Ох ох ох Так кэширование делать нельзя [pre2] def f(n): if n<2: return 1 if n>=2 and n%3==0: return f(n/3) - 1 if n>=2 and n%3!=0: return f(n-1) + 17 for i in range(1,100000): if f(i)==110: print(i) break[/pre2] Если хотите кэширование можете использовать специальный декоратор [pre2]from functools import * @lru_cache(None) def f(n): if n<2: return 1 if n>=2 and n%3==0: return f(n/3) - 1 if n>=2 and n%3!=0: return f(n-1) + 17[/pre2]

uchitelka: cabanov.alexey Благодарю! Ранее так и решала, но изменила способ и вот... грабли!



полная версия страницы