У меня возникают некоторые проблемы при попытке выяснить текущую динамическую среду во время рекурсивного вызова функции и значений, с которыми связаны локальные переменные в функции. Это не просто проблема, с которой я сталкиваюсь в ML, но даже в JAVAЯ очень запутался по поводу объема переменных во время рекурсивных вызовов.
fun examplefunction(x:int,ys:int list)=
if null (tl ys)
then 0
else
let
val temp=0
val temp=temp +(hd ys)
val tail= (tl ys)
val k=1
in
if x>temp andalso temp+(hd tail)>=x
then k
else k+examplefunction(x,tl ys)
end
Мне трудно понять, как переменная temp обновляется во время рекурсивного вызова (если я предполагаю, что входной список int достаточно велик).Например, в случае
x = 5 и ys = [2,1,3], и я вызываю функцию с помощью
examplefunction (5, [2,1,3]);
В этом случае (tl ys) в строке 2 не равно нулю
и, следовательно, еще выполняется, а в строке 6 переменная temp связывается с целым числом 0, в следующей строке 7 она получаетзатеняется, и в новом динамическом окружении он становится связанным с 2. Переменная tail связана с int list [1], а переменная k связана с 1.
Теперь в "in" (строка 10)выражение if в строке 12 имеет значение false, поэтому в строке 16 выполняется else, который рекурсивно вызывает функцию
examplefunction (5, [1,3])
Я хочу понять, в какой средеэто вызов функции "examplefunction (5, [1,3])"? *
Когда этот рекурсивный вызов функции получает исключения, в строке 6 временная переменная, равная 2 в предыдущем вызове, затеняется на 0 изатем 0 + hd [1,3] = 0 + 1 = 1.
Это очень смущает меня и действительнобольшое препятствие в написании некоторых функций в задании на домашнее задание.Пожалуйста, дайте мне знать, если вопрос не ясен.