【发布时间】:2016-10-19 11:49:18
【问题描述】:
我在 ATS 中编码,并试图创建一个函数来查找给定整数的平方根。此处提供的代码完全符合我的要求,而不是尾递归。
implement intsqrt(n) =
if(n >= 1)
then let
val n4 = n / 4
val res = 2 * intsqrt(n4) + 1
in
if(res * res <= n) then res else 2*intsqrt(n4)
end
else n
我不确定其他人是否熟悉这种语言,但这是我使用它的第一周。我知道常规递归和尾递归之间的明显区别,但我只是不明白如何更改。
我什至不需要确切的代码来做到这一点,我只是想知道这怎么可能。为了让我找到 sqrt,我必须计算 n4 = 1 / n,然后将其乘以 2。但是,这样做会进入递归。我想要做的是计算一个结果,然后将它传递给我的下一个递归调用。
这是否意味着我需要以某种方式向后工作?希望这一切都有意义,但如果需要,我会尝试澄清。
谢谢!
【问题讨论】:
-
你确定你的算法是正确的吗?我把它翻译成 Scheme,它适用于 4 和 16,但不适用于 9 和 25,除非我在翻译过程中出错。
-
@uselpa 据我所知是的。这是一个作业,提示是“对于每个 n >= 1,让 n4 = n / 4。然后 sqrt(n) = 2*sqrt(n4) 或 sqrt(n) = 2*sqrt(n4) + 1 。”即使它可能不适用于每个数字,您是否看到任何实用的方法将其转换为尾递归?
-
@uselpa 我得到了 3。据我所知,它完全按照它应该的方式工作。这更多的是关于如何构建我的代码。
-
关于尾递归:看看所谓的“累积参数”。
-
我发现了我的错误(
n/4是 ATS 中的整数除法)。我认为您不能以尾递归的方式实现这一点。你确定可以做到吗?
标签: function recursion tail-recursion ats