我想弄清楚如何编写以下伪代码:
# 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 函数的方法,以便我可以迭代地定义每个函数。
我尝试使用两个函数的递归来代替索引,但我得到“超出最大递归深度”。
这是一个最小的工作示例:
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))
最佳答案
是的,一般想法是对结果进行“索引”以避免重新计算它们。实现这一目标的最简单方法是“内存”,这意味着告诉函数记住它已经计算出的值的结果。
如果 f(i+1) 基于 f(i)(其中 i 是自然数),那么这会特别有效。
在 Python3 中,使用装饰器对 1 个变量函数执行此操作非常简单:
导入函数工具
@functools.lru_cache(最大大小=无)
定义 f(x):
……
返回 ....
想了解更多这方面的知识,您可以咨询一下
What is memoization and how can I use it in Python? 。 (如果您使用的是 Python 2.7,还有一种方法可以使用预先打包的装饰器来实现。)
您的具体情况(如果我对您的伪代码的理解是正确的)依赖于两个变量函数,其中 i 是一个整数变量,x 是一个符号(即不应该在这里解析)。所以你需要沿着 i 进行内存。
为了避免在粗暴地请求 5 的图像时破坏堆栈(不知道为什么,但毫无疑问,递归比表面上看到的要多),然后使用 for
循环来计算您的图像范围为 0 到 5(按顺序:0、1、2...)。
我希望这会有所帮助。
关于python - 如何为 for 循环中使用的 python 函数建立索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44297747/