Если взять пример Фибоначчи, если
f(n) = f(n-1) + f(n-2)
, то мы можем выполнить алгебру c манипуляцию, чтобы получить:
f(n-2) = f(n) - f(n-1)
и, следовательно:
f(n) = f(n+2) - f(n+1)
Так что вполне возможно go либо в обратном, либо в прямом направлении, если мы знаем, что найдем базовый случай в любом направлении, в котором движемся.
>>> def f(n: int) -> int:
... if n < 14: # count up to 14
... return f(n+2) - f(n+1)
... elif n == 14:
... return 377
... elif n == 15:
... return 610
... else: # count back to 15
... return f(n-2) + f(n-1)
...
>>> [f(n) for n in range(20)]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181]
Для вашего другого примера, я подозреваю, что не является решением:
>>> from typing import Callable
>>>
>>> def recurrence_func(f_1: int) -> Callable[[int], int]:
... """
... Generates a version of the recurrence relation
... function with the given base case value of f(1).
... """
... f_0 = 1
... def f(n: int) -> int:
... if n == 0:
... return f_0
... if n == 1:
... return f_1
... return (-1**(n+1)) * (2*f(n-1) - f(n-2))
... return f
...
>>>
>>> [(f_1, recurrence_func(f_1)(15)) for f_1 in range(-2, 3)]
[(-2, -470832), (-1, -275807), (0, -80782), (1, 114243), (2, 309268)]
, поскольку не похоже, что значение f(15)
будет сходиться с тем, которое вам нужно, с более высокими или более низкими значениями f(1)
.