Differentia specifica
Чтобы более детально разобраться с некоторыми отличительными особенностями C--, рассмотрим пример трех процедур (sp1, sp2, sp3), вычисляющих сумму и произведение целых чисел от 1 до n. /* Обычная рекурсия */ sp1(word4 n) { word4 s, p; if n == 1 { return (1, 1); } else { s, p = sp1(n-1); return (s+n, p*n); } }
/* Tail-рекурсия */ sp2(word4 n) { jump sp2_help (n, 1, 1); }
sp2_help (word4 n, word4 s, word4 p) { if n==1 { return (s, p); } else { jump sp2_help (n-1, s+n, p*n) } }
/* Циклы */ sp3(word4 n) { word4 s, p; s = 1; p = 1;
loop: if n==1 { return (s, p); } else { s = s+n; p = p*n; n = n-1; goto loop; } }
(лат.) - отличительный признак; характерная особенность.