Поскольку он статически ограничен, вы можете изменить имена переменных внутри функций, чтобы избежать путаницы, намеченной вопросом.Я заменяю y в p1 на p1y, p2 в p1 на p1p2, x в p1p2 на p1p2x и x в p2 на p2x (хотя теперь это выглядит еще страшнее).Я также немного изменил форматирование.
program main
int x, y;
void p1(value int p1y, void q(reference int)) {
void p1p2(reference int p1p2x) {
p1p2x := p1y + 2;
print(p1p2x);
q(p1y);
}
if x = p1y then {
q(p1y);
} else {
p1(p1y+1, p1p2);
}
}
void p2(reference int p2x) {
p2x := y + 2;
print(p2x);
}
x := 2;
y := x;
p1(0, p2);
end main
Так как это домашнее задание, вы сможете легко взять его отсюда, используя любые методы, которым вас научили (следуйте за исполнением строка за строкой, нарисуйте стек,так далее).Но окончательный ответ - да, он будет бесконечно повторяться, печатая 4
6
8
и т. Д.