New*_*ode 5 java algorithm recursion memoization
当我在思考快速计算数字能力的算法时,就会出现这个问题,比如计算x^n.
在Java中,递归部分类似于:
return power(x,n/2) * power(x,n/2);
Run Code Online (Sandbox Code Playgroud)
所以在程序返回值之后power(x,n/2),它会再次通过整个递归过程来计算第二个值power(x,n/2)吗?
如果是这样,我们应该先将值存储在某个变量中,然后返回该值的平方吗?
Ker*_* SB 13
你所记得的是memoization:一个纯函数(即一个返回值仅取决于参数值的函数)可以记住它以前遇到的参数的结果.
Memoization由一些高级特殊用途语言(如Maple)执行.但是,默认情况下,通用语言不具有此(相当复杂)的行为.
但是,在您的情况下,这不是必要的.您的算法不是使用递归,而是更好地实现为迭代.通过重复平方的二进制求幂是标准算法.
这是一些类似C的伪代码(我的Java不是100%):
// compute pow(base, exponent)
int result = 1;
int term = base;
while (exponent != 0)
{
if (exponent % 2 != 0) { result *= term; }
term = term * term;
exponent /= 2;
}
return result;
Run Code Online (Sandbox Code Playgroud)
对于一些示例,7是二进制的111,因此b 7 = b 1 × b 2 × b 4,并且我们仅需要跟踪运行项的一个副本.另一个:5 = 101b,所以b 5 = b 1 ×1× b 4.
在C++中,为任何R f(T1, T2, ..., TN)将内存存储在哈希映射中的函数构建通用的memoizing包装器非常容易std::unordered_map<std::tuple<T1, ..., TN>, R>; 在调用时,包装器检查参数元组是否已经存在,如果是,则返回映射中的值,如果不是,则执行计算并将结果插入映射中.我确信类似的东西可以用Java来装配.