一尘不染

俄罗斯农民繁殖

algorithm

这是我对俄罗斯农民乘法的简短实现。如何改善?

限制 :仅当a> 0,b> 0时有效

for(p=0;p+=(a&1)*b,a!=1;a>>=1,b<<=1);

阅读 229

收藏
2020-07-28

共1个答案

一尘不染

可以通过添加空格,适当的缩进和适当的函数体来改进它:

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(ab&optional(sum 0))
  “返回a和b的乘积,
   通过农民的繁殖来实现。”
  (如果(= a 1)
      (+ b总和)
      (农mul(地板(/ a 2))
                    (* b 2)
                    (+和(* b(对数a 1))))))
2020-07-28