如何索引python函数以用于for循环?

时间:2017-06-01 02:54:08

标签: python function for-loop recursion indexing

我想知道如何编写以下伪代码:

# Base-case
u_0(x) = x^3

for i in [0,5):
    u_(i+1)(x) = u_(i)(x)^2

所以最后我可以打电话给u_5(x),例如。

我在完成上述任务时遇到的困难是找到一种通过i索引Python函数的方法,以便我可以迭代地定义每个函数。

我尝试使用带有两个函数的递归来代替索引,但我得到了#34;超出最大递归深度"。

这是一个最小的工作示例:

import math
import sympy as sym

a,b = sym.symbols('x y')

def f1(x,y):
    return sym.sin(x) + sym.cos(y)*sym.tan(x*y)

for i in range(0,5):
    def f2(x,y):
    return sym.diff(f1(x,y),x) + sym.cos(sym.diff(f1(x,y),y,y))

    def f1(x,y):
        return f2(x,y)

print(f2(a,b))

2 个答案:

答案 0 :(得分:1)

是的,一般的想法是" index"结果是为了避免重新计算它们。实现这一目标的最简单方法是" memoize",这意味着告诉函数记住已经计算过的值的结果。

如果f(i + 1)基于f(i),其中i是自然数,那可能特别有效。

在Python3中,对于1变量函数来说,使用装饰器非常简单:

import functools @functools.lru_cache(maxsize=None) def f(x): ..... return .... 要了解更多相关信息,请咨询 What is memoization and how can I use it in Python?。 (如果您使用的是Python 2.7,还有一种方法可以使用预先打包的装饰器。)

您的具体情况(如果我对您的伪代码的理解是正确的)依赖于两个变量函数,其中i是整数变量而x是符号(即不应该在这里解析)。所以你需要沿着我记忆。

为了避免在你粗暴地要求5的图像时将堆叠起来(不确定为什么,但毫无疑问会有更多的递归而不是满足眼睛),然后使用for循环计算你的图像范围从0到5(按此顺序:0,1,2 ......)。

我希望这会有所帮助。

答案 1 :(得分:0)

答案其实非常简单:

伪代码:

u_0(x) = x^3

for i in [0,5):
     u_(i+1)(x) = u_(i)(x)^2

实际代码:

import sympy as sym

u = [None]*6 #Creates an empty array of 6 entries, i.e., u[0], u[1], ..., u[5]

x=sym.symbols('x')

u[0] = lambda x: x**3

for i in range(0,5):
    u[i+1] = lambda x, i=i: (u[i](x))**2 #the i=i in the argument of the lambda function is 
     #necessary in Python; for more about this, see this question.

#Now, the functions are stores in the array u.  However, to call them (e.g., evaluate them, 
#plot them, print them, etc) requires that we "lambdify" them, i.e., replace sympy 
#functions with numpy functions, which the following for loop accomplishes:

for i in range(0,6):
    ulambdified[i] = sym.lambdify(x,u[i](x),"numpy")

for i in range(0,6):
    print(ulambdified[i](x))