这是我对俄罗斯农民乘法的简短实现。如何改善?
限制 :仅当a> 0,b> 0时有效
for(p=0;p+=(a&1)*b,a!=1;a>>=1,b<<=1);
可以通过添加空格,适当的缩进和适当的函数体来改进它:
int peasant_mult (int a, int b) { for (p = 0; p += (a & 1) * b, a != 1; a /= 2, b *= 2); return p;}
看到?现在很清楚如何for使用声明的三个部分。请记住,程序主要是为人眼编写的。不可读的代码始终是错误的代码。
for
现在,为了个人娱乐,我使用了尾递归版本:
(defun peasant-mult(ab&optional(sum 0)) “返回a和b的乘积, 通过农民的繁殖来实现。” (如果(= a 1) (+ b总和) (农mul(地板(/ a 2)) (* b 2) (+和(* b(对数a 1))))))