代码之家  ›  专栏  ›  技术社区  ›  user87219

迭代对数幂

  •  3
  • user87219  · 技术社区  · 11 年前

    我最近轰炸了一次采访(手机屏幕上有折叠的)。 问题是: 写一个求x^y的幂的迭代O(lg n)算法(x是二重数,y>0是整数)。

    我首先做了递归除法和征服法,并尝试将其转换为迭代法。。。我不能:S 是否有将递归转换为迭代的方法(尾部递归很容易,但递归函数有两个可能的递归调用,这取决于决定调用哪个调用的条件)?

    1 回复  |  直到 11 年前
        1
  •  6
  •   templatetypedef    11 年前

    展开此项的典型方法是使用b的位表示 1. 2. 4. 8. 并且在每个步骤确定是否将其乘以总数。如下所示:

    double result = 1;
    double multiplier = a;
    for (double multiplier = a; b != 0; multiplier *= multiplier, b /= 2) {
        if (b % 2 == 1) {
           result *= multiplier;
        }
    }
    

    例如,要计算3 5. ,我们会注意到5具有二进制表示101,所以我们会乘以3 1. 和3 4. .

    希望这有帮助!