【问题标题】:Reassign function and avoid recursive definition in Julia在 Julia 中重新分配函数并避免递归定义
【发布时间】:2020-11-12 10:12:25
【问题描述】:

我需要对一系列函数进行操作

h_k(x) = (I + f_k( ) )^k g(x)

对于每个 k=1,...,N.

一个基本的例子(N=2,f_k=f)如下:

f(x) = x^2
g(x) = x
h1(x) = g(x) + f(g(x))
h2(x) = g(x) + f(g(x)) + f(g(x) + f(g(x)))
println(h1(1)) # returns 2
println(h2(1)) # returns 6

我需要在循环中编写它,最好在每次迭代时重新定义 g(x)。不幸的是,在不与 g(x) 的递归定义的语法冲突的情况下,我不知道如何在 Julia 中执行此操作。确实,

f(x) = x^2
g(x) = x
for i=1:2
    global g(x) = g(x) + f(g(x))
    println(g(1))
end

导致 StackOverflowError。

在 Julia 中,使用之前的定义重新定义 g(x) 的正确方法是什么?

附:对于那些建议可以通过递归解决这个问题的人:我想使用 for 循环,因为函数 f_k(x)(在上面,每个 f_k = f)是如何在这个派生的实际问题中计算出来的.

【问题讨论】:

    标签: recursion julia


    【解决方案1】:

    我不确定这是否最好,但一种自然的方法是在这里使用匿名函数,如下所示:

    let
        f(x) = x^2
        g = x -> x
        for i=1:2
            l = g
            g = x -> l(x) + f(l(x))
            println(g(1))
        end
    end
    

    或者像这样

    f(x) = x^2
    g = x -> x
    for i=1:4
        l = g
        global g = x -> l(x) + f(l(x))
        println(g(1))
    end
    

    (我更喜欢使用let 的前一个选项,因为它避免使用全局变量)

    问题在于l 是一个循环局部变量,在每次迭代时都会获得一个新的绑定,而g 在循环外部。

    您还可以查看 Julia 手册的 this section

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多