【问题标题】:How can you index python functions for use in a for loop?如何索引 python 函数以在 for 循环中使用?
【发布时间】:2017-11-02 00:35:18
【问题描述】:

我想弄清楚如何编写以下伪代码:

# 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))

【问题讨论】:

  • 你的问题太模糊了,u_i(x)是函数还是变量?
  • 你能展示你真正想要做什么吗?递归是解决问题的自然方法。如果深度太大,您可以使用显式堆栈。
  • 一步(直接到基本情况)并不深。您是否调试了程序以验证您没有意外地进行无限递归?无论如何,递归(或显式堆栈版本)似乎是解决方案。请包括MCVE 以澄清。
  • u_(i)(x) = u_0(x)^(2^i) 为什么这里需要递归或任何循环?
  • @user46944:您的示例需要最小化、完整且可验证。 :) 请花几分钟将您现有的程序分割成最小的 Python 脚本来重现错误,并编辑您的问题以包含它。理想情况下,人们可以复制它并在本地运行它。当您删除程序的不相关部分时,您通常会自己发现问题。

标签: python function for-loop recursion indexing


【解决方案1】:

是的,一般的想法是“索引”结果以避免重新计算它们。实现这一点的最简单方法是“记忆”,这意味着告诉函数记住它已经计算的值的结果。

如果 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 是符号(即不应该在这里解决)。所以你需要沿着 i 记忆。

为了避免在您粗暴地要求 5 的图像时炸毁堆栈(不知道为什么,但毫无疑问,递归比眼睛看到的要多),然后使用 for 循环来计算范围内的图像从 0 到 5(按此顺序:0、1、2...)。

我希望这会有所帮助。

【讨论】:

    【解决方案2】:

    答案其实很简单:

    伪代码:

    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))
    

    【讨论】:

    • 我的错误:您不必进行 lambdify 打印。 print(u[2](x)) 工作得很好。
    猜你喜欢
    • 2019-05-27
    • 1970-01-01
    • 2014-06-19
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    • 2013-03-19
    • 1970-01-01
    相关资源
    最近更新 更多