【发布时间】:2017-08-17 03:51:26
【问题描述】:
在第 2 章中提到求幂时,作者提到
"所需的乘法次数显然最多为 2 log n(底数为 2),因为在 最多需要两次乘法(如果 n 是奇数)才能将问题减半。再次,可以写出递推公式并求解。”
代码如下:
int pow( int x, unsigned int n)
{
/*1*/ if( n == 0 )
/*2*/ return 1;
/*1*/ if( n == 1 )
/*4*/ return x;
/*5*/ if( even( n ) )
/*6*/ return( pow( x*x, n/2 ) );
else
/*7*/ return( pow( x*x, n/2 ) * x );
}
问: 正如作者所说,
2^16 最多需要 8 次乘法
2^15 ... 7 ...
2^14 ... 7 ...
2^13 ... 7 ...
2^12 ... 7 ...
其实我是按照代码执行的:
2^16 .... 4 ...
2^15 .... 6 ...
2^14 ... 5 ...
2^13 ... 5 ...
2^12 ... 4 ...
那么,是不是哪里出错了?
【问题讨论】:
-
16 的 4 倍除以 2。需要 4 次迭代。所以这本书可能是错的。
-
他说最多是一个上限估计。您所有的数字都较低,因此他的上限成立。 (但可能会改进)
-
不确定您的投诉内容。他说乘法的数量是
<= 2 log n(这就是“最多”的意思)。你的情况n = 2^16的乘法次数是4,根据作者的说法,确实是' -
如果我说'任意人的腿数最多 7',我说的是真的。
-
@KamiKaze 那么如何获得上限
2 log n?
标签: c algorithm exponentiation