我想知道如何编写以下伪代码:
# 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))
答案 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))