Python 求给定递归函数的值
给出了f0=0,f1=1,f2=2,fk=fk-1+fk-3,n和ki 我需要写一个程序,在给定循环周期的ki位置上计算n个数字 例1Python 求给定递归函数的值,python,algorithm,Python,Algorithm,给出了f0=0,f1=1,f2=2,fk=fk-1+fk-3,n和ki 我需要写一个程序,在给定循环周期的ki位置上计算n个数字 例1 4 0 1 2 3 例1 0 1 2 2 例2 3 4 5 4 例2 3 5 3 这是我的想法 def get_numbers(): with open('input.txt','r') as file_in: n = int(file_in.readline()[:-1]) input_list = map(in
4
0 1 2 3
例1
0 1 2 2
例2
3
4 5 4
例2
3 5 3
这是我的想法
def get_numbers():
with open('input.txt','r') as file_in:
n = int(file_in.readline()[:-1])
input_list = map(int,file_in.readline().split(' '))
print(foo(n,input_list))
def find_number(n):
a, b, c = 0, 1, 2
for _ in range(n+1):
yield a
a, b, c = b, c, a + c
def foo(n,input_values):
result = str()
for elem in (list(find_number(i))[-1] for i in input_values):
result += str(elem) + " "
return result[:-1]
get_numbers()
我曾尝试使用生成器来加速我的代码,但不知道如何使其使用更少的内存
因此,我试图让我的代码消耗更少的内存,或者只是找到另一个(更简单的)解决方案。我不理解您的inputm输出或“n”,但我的想法是:如果定义了f0、f1、f2,那么您的函数必须在
k>2
时执行某些操作,而当k<2是k时,则必须执行fk
我将f0称为f(0),因此:
我不理解您的inputm输出或“n”,但我的想法是:如果定义了f0、f1、f2,那么您的函数必须在
k>2
时执行某些操作,而当k<2是k时,fk必须执行某些操作
我将f0称为f(0),因此:
要获得更快但更高效的代码:
k = int(input('Enter a value for k: '))
f0 = 0
f1 = 1
f2 = 2
def calc(k):
try:
return eval(f'f{k}')
except:
kLessOne = k-1
kLessThree = k-3
try:
eval(f'f{kLessOne}')
except:
globals()[f'f{kLessOne}'] = calc(k-1)
try:
eval(f'f{kLessThree}')
except:
globals()[f'f{kLessThree}'] = calc(k-3)
return eval(f'f{kLessOne} + f{kLessThree}')
print(calc(k))
此代码在运行时实例化全局变量,我不建议您这样做。要获得更快但更高效的代码:
k = int(input('Enter a value for k: '))
f0 = 0
f1 = 1
f2 = 2
def calc(k):
try:
return eval(f'f{k}')
except:
kLessOne = k-1
kLessThree = k-3
try:
eval(f'f{kLessOne}')
except:
globals()[f'f{kLessOne}'] = calc(k-1)
try:
eval(f'f{kLessThree}')
except:
globals()[f'f{kLessThree}'] = calc(k-3)
return eval(f'f{kLessOne} + f{kLessThree}')
print(calc(k))
此代码在运行时实例化全局变量,我不建议您这样做。您可以利用
functools.lru\u cache
()缓存递归函数的结果:
from functools import lru_cache
@lru_cache(maxsize=None)
def f(k):
if k < 3:
return k
return f(k-1) + f(k-3)
def f2(k):
if k < 3:
return k
return f2(k-1) + f2(k-3)
from timeit import timeit
t1 = timeit(lambda: f(45), number=1)
t2 = timeit(lambda: f2(45), number=1)
print(t1)
print(t2)
对于k=50,差异更大:
t1 = timeit(lambda: f(50), number=1)
t2 = timeit(lambda: f2(50), number=1)
印刷品:
2.6389000140625285e-05
18.368431184999736
您可以利用
functools.lru\u cache
()缓存递归函数的结果:
from functools import lru_cache
@lru_cache(maxsize=None)
def f(k):
if k < 3:
return k
return f(k-1) + f(k-3)
def f2(k):
if k < 3:
return k
return f2(k-1) + f2(k-3)
from timeit import timeit
t1 = timeit(lambda: f(45), number=1)
t2 = timeit(lambda: f2(45), number=1)
print(t1)
print(t2)
对于k=50,差异更大:
t1 = timeit(lambda: f(50), number=1)
t2 = timeit(lambda: f2(50), number=1)
印刷品:
2.6389000140625285e-05
18.368431184999736
这需要一些工作,所以很难解释我所做的一切。然而,我在您的原始代码中注意到的很少事情是函数
foo
和find_number
之间的关系;另外,函数foo
正在执行大量的字符串操作,这些操作非常昂贵。
我能够得到简化的代码,并且它可以与您提供的两个示例输入一起工作。然而,我不能再进一步测试了。希望对你有用
# unchanged from yours.
def get_numbers():
with open('input.txt', 'r') as file_in:
n = int(file_in.readline()[:-1])
input_list = map(int, file_in.readline().split(' '))
print(foo(n, input_list))
# I removed the generator. I let the loop scramble
# the numbers, but only return the one bit that is
# relevant inside `foo`, which gets greatly simplified
def find_number(n):
a, b, c = 0, 1, 2
for _ in range(n):
a, b, c = b, c, a + c
return a
# With the change in `find_numbers` this gets much simpler
# which should help with speed and memory consumption
def foo(n, input_values):
return [find_number(i) for i in input_values]
这需要一些工作,所以很难解释我所做的一切。然而,我在您的原始代码中注意到的很少事情是函数
foo
和find_number
之间的关系;另外,函数foo
正在执行大量的字符串操作,这些操作非常昂贵。
我能够得到简化的代码,并且它可以与您提供的两个示例输入一起工作。然而,我不能再进一步测试了。希望对你有用
# unchanged from yours.
def get_numbers():
with open('input.txt', 'r') as file_in:
n = int(file_in.readline()[:-1])
input_list = map(int, file_in.readline().split(' '))
print(foo(n, input_list))
# I removed the generator. I let the loop scramble
# the numbers, but only return the one bit that is
# relevant inside `foo`, which gets greatly simplified
def find_number(n):
a, b, c = 0, 1, 2
for _ in range(n):
a, b, c = b, c, a + c
return a
# With the change in `find_numbers` this gets much simpler
# which should help with speed and memory consumption
def foo(n, input_values):
return [find_number(i) for i in input_values]
对大哥来说是慢的,大哥你的k大吗?对大哥来说是慢的,大哥你的k大吗?