Я кодирую в 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, а затем умножить его на два. Однако это происходит в рекурсии. То, что я хочу сделать, - это вычислить результат, а затем передать его на мой следующий рекурсивный вызов.
Означает ли это, что мне нужно работать в обратном направлении? Надеюсь, все это имеет смысл, но я попытаюсь прояснить, если потребуется.
Спасибо!
Вы уверены, что ваш алгоритм верен? Я перевел его в 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