Его можно улучшить, добавив пробел, правильный отступ и правильное тело функции:
int peasant_mult (int a, int b) {
for (p = 0;
p += (a & 1) * b, a != 1;
a /= 2, b *= 2);
return p;}
См? Теперь понятно, как используются три части декларации for
. Помните, программы написаны в основном для человеческих глаз. Нечитаемый код всегда плохой код.
А теперь, для моего личного удовольствия, хвостовая рекурсивная версия:
(defun peasant-mult (a b &optional (sum 0))
"returns the product of a and b,
achieved by peasant multiplication."
(if (= a 1)
(+ b sum)
(peasant-mult (floor (/ a 2))
(* b 2)
(+ sum (* b (logand a 1))))))