Recursion 重新分配函数并避免Julia中的递归定义

Recursion 重新分配函数并避免Julia中的递归定义,recursion,julia,Recursion,Julia,我需要对一系列功能进行操作 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)。不幸的是,我不

我需要对一系列功能进行操作

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)。不幸的是,我不知道如何在Julia中做到这一点,而不与g(x)的递归定义的语法相冲突。的确

导致堆栈溢出错误

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


另外,对于那些认为这个问题可以用递归解决的人:我想使用For循环,因为函数f_k(x)(在上面,每个f_k=f)是如何在这个问题的实际问题中计算出来的。

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

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
是循环的外部变量

你也可以查阅朱莉娅手册

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