Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 求给定递归函数的值_Python_Algorithm - Fatal编程技术网

Python 求给定递归函数的值

Python 求给定递归函数的值,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

给出了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(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大吗?