Вот как это было бы решено в Схеме:
(define (Cat num1 num2)
(define (CatLoop num1 num2 temp)
(if (= temp 0)
(+ num1 num2)
(CatLoop (* num1 10) num2 (/ temp 10))))
(CatLoop num1 num2 num2))
[Может содержать синтаксические ошибки, я не проверял.]
На языке, подобном Cс вложенными функциями:
int Cat(int num1, int num2) {
int CatLoop(int num1, int num2, int temp) {
if (temp == 0)
return num1 + num2;
else
return CatLoop(num1 * 10, num2, temp / 10);
}
return CatLoop(num1, num2, num2);
}
После оптимизации хвостового вызова происходит развертывание следующего:
int Cat(int num1, int num2) {
int temp = num2;
// goto CatLoop;
CatLoop:
if (temp == 0)
goto Done;
Else:
num1 *= 10;
temp /= 10;
goto CatLoop;
Done:
return num1 + num2;
}