algorithm - 幂次幂的递归算法

标签 algorithm recursion pseudocode

我需要计算一个幂的幂。例如:3^2^n。您可以将 n 视为输入,但此示例与 9^n 不同。我使用循环编写了一种算法,但现在我需要编写递归算法。我找不到一种有效的方式来编写它。

最佳答案

我继续在 Ruby 中实现了它,它非常接近伪代码并且具有可测试的额外好处。由于 Ruby 还具有任意精度的整数运算,因此以下代码适用于非平凡的参数。

此实现基于对底进行平方并在指数为偶数时将其提高到指定幂的一半的老技巧,因此递归堆栈按对数而不是线性的幂增长。这是受到 Ilya 的回答的启发,但我发现 y > 1 and n > 1 的情况不正确,导致我在 elif n 中实现的递归调用中使用递归调用> 1 下面的行:

def powpow(x, y, n)
  if y == 0
    return 1
  elsif y == 1 || n == 0
    return x
  elsif n > 1
    return powpow(x, powpow(y, n, 1), 1)
  elsif y.even?
    return powpow(x * x, y / 2, 1)
  else
    return x * powpow(x * x, y / 2, 1)
  end
end

p powpow(3,2,5)   # => 1853020188851841

我能够直接确认该结果:

irb(main):001:0> 2**5
=> 32
irb(main):002:0> 3**32
=> 1853020188851841

关于algorithm - 幂次幂的递归算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36289650/

相关文章:

algorithm - 深度受限搜索递归伪代码

algorithm - 寻找哈希算法的伪代码(开放、链接和多重)

algorithm - 这是哪种密码算法?

java - 为什么 isBinarySearchTree() 函数不正确

c++ - 为什么编译器报告 "operator<< and operator>> recursive on all control paths will cause stack overflow "?

c++ - 使用排序函数和递归比较器对 boost 的 multi_array 进行排序

algorithm - 奇数正整数求和的递归算法

javascript - 递归选择排序(JS)

c++ - 包含全局最小值的 vector 索引

c - 对角带中的遍历矩阵