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
s,而不是正在定义的f
,因为f
不是自递归定义。因此,在该定义中对val
的任何引用都必须依赖于它在外部范围中的可用性 但是重写了f
位,因为在g(3)
中的
和
结束之间,内部
(现在f
)是阴影。因此,无论是g
还是乐趣
都与val
中的
-
的阴影无关
- (还有一些更详细的说明,我还没有详细说明。
和aval rec
的确切范围。)let val f=…
至于你的问题,
~>
表示重写,所以我这里不是指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