我在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
@uselpa据我所知是的。这是一项任务,提示是“对于每个n> = 1,让n4 = n/4。然后sqrt(n)= 2 * sqrt(n4)或 sqrt(n)= 2 * sqrt(n4)+ 1.”即使它可能不适用于每个数字,你是否看到任何可行的方法将其变为尾递归? – rmw
@uselpa我得到了3.据我所知,它的工作原理应该如何。这更多的是关于如何构建我的代码。 – rmw