Recursion 关于sml递归函数的几个问题 当调用f(x-1)时,是调用f(x)=x+10还是f(x)=如果… 这是尾部递归吗

Recursion 关于sml递归函数的几个问题 当调用f(x-1)时,是调用f(x)=x+10还是f(x)=如果… 这是尾部递归吗,recursion,dynamic-memory-allocation,sml,tail-recursion,static-allocation,Recursion,Dynamic Memory Allocation,Sml,Tail Recursion,Static Allocation,我应该如何使用静态/动态分配重写它 let fun f(x) = x + 10 in let fun f(x) = if x < 1 then 0 else f(x-1) in f(3) end end 让fun f(x)=x+10 在里面 设f(x)=如果x表示重写,所以我这里不是指SML操作符) 下面是我的第二个示例(不是您的代码)的外观示例: 你的手工评估看起来会有所不同,并且可能得出不同的结论 什么是尾部递归?提供一个定义,并询问您的代码是否满足该定义 我

我应该如何使用静态/动态分配重写它

let fun f(x) = x + 10
in
    let fun f(x) = if x < 1 then 0 else f(x-1)
    in f(3)
    end
end
让fun f(x)=x+10
在里面
设f(x)=如果x<1,则0,否则f(x-1)
在f(3)中
结束
结束

在回答您的问题之前,以下是对您的代码的一些观察:

   g(3)
~> (fn x => f(x + 2) * 2)(3)
~> f(3 + 2) * 2
~> f(5) * 2
~> (if (5 mod 2 = 0) then 5 - 10 else 5 + 10) * 2
~> (if (1 = 0) then 5 - 10 else 5 + 10) * 2
~> (5 + 10) * 2
~> 15 * 2
~> 30
  • 有两个函数
    f
    ,一个在另一个内部。他们彼此不同

  • 为了减少这种混淆,可以将内部函数重命名为
    g

    let fun f(x) = x + 10
    in
        let fun g(x) = if x < 1 then 0 else g(x-1)
        in g(3)
        end
    end
    
    如果在第二段代码中,内部的
    f
    重命名为
    g
    ,它看起来像:

    let fun f(x) = if (x mod 2 = 0) then x - 10 else x + 10
    in
        let val g = fn x => f(x + 2) * 2
        in g(3)
        end
    end
    
    重要的一点是
    f(x+2)
    部分没有被重写为
    g(x+2)
    ,因为
    val
    意味着对
    f
    的引用是外部的
    f
    s,而不是正在定义的
    f
    ,因为
    val
    不是自递归定义。因此,在该定义中对
    f
    的任何引用都必须依赖于它在外部范围中的可用性

    但是重写了
    g(3)
    位,因为在
    中的
    结束之间,内部
    f
    (现在
    g
    )是阴影。因此,无论是
    乐趣
    还是
    val
    都与
    中的
    -
    的阴影无关

  • (还有一些更详细的说明,我还没有详细说明。
    val rec
    和a
    let val f=…
    的确切范围。)


至于你的问题,

  • 你现在应该可以回答这个问题了。提供答案的一个很好的方法是1)为了清晰起见重命名内部函数,2)使用替换手动计算代码(每行重写一次,
    ~>
    表示重写,所以我这里不是指SML操作符)

    下面是我的第二个示例(不是您的代码)的外观示例:

    你的手工评估看起来会有所不同,并且可能得出不同的结论

  • 什么是尾部递归?提供一个定义,并询问您的代码是否满足该定义

  • 我不知道你用静态/动态分配重写它是什么意思。你得详细说明
  •    g(3)
    ~> (fn x => f(x + 2) * 2)(3)
    ~> f(3 + 2) * 2
    ~> f(5) * 2
    ~> (if (5 mod 2 = 0) then 5 - 10 else 5 + 10) * 2
    ~> (if (1 = 0) then 5 - 10 else 5 + 10) * 2
    ~> (5 + 10) * 2
    ~> 15 * 2
    ~> 30