目录
- 1. 题目:
- 2. 代码:
- 2.1边界条件处理
- 2.2分治策略
- 2.3合并结果
- 2.4递归终止条件
- 2.5效率分析
- 小结:
1. 题目:
2. 代码:
#include<iostream>
using namespace std;
int pow(int x, int n){
// 边界条件
if (x == 0) return 0; // 排除特殊情况
if (n == 0) return 1; // 0次方等于1
// 分、治
int exp2 = pow(x, n / 2); // 计算 x^(n/2)
// 合
if (n % 2 == 1) return exp2 * exp2 * x; // 奇数则返回 x^(n/2) * x^(n/2) * x
else return exp2 * exp2; // 偶数则返回 x^(n/2) * x^(n/2)
}
int main(){
int x, n;
cin >> x;
cin >> n;
cout << pow(x, n) << endl;
}
这里用到的是递归与分治的思想,只不过只计算了其中一个递归,也就是说时间复杂度为:
T(n) = T(n/2) + 1
计算得:T(n) = logn
主要写好 分、治、合 三个步骤即可
2.1边界条件处理
- 如果
x
为 0,则直接返回 0,因为任何数的 0 次幂都是 1,但 0 的任何正整数次幂都是 0(这里处理的是x
为 0 的特殊情况)。 - 如果
n
为 0,则根据幂的定义,任何非零数的 0 次幂都是 1,因此返回 1。
2.2分治策略
函数通过递归调用自身来计算 x
的 n/2
次幂,存储在变量 exp2
中。这一步是“分”的过程,即将原问题分解为规模更小但结构相似的子问题。
2.3合并结果
接下来,根据 n
的奇偶性来合并结果:
- 如果
n
是奇数,则最终结果是exp2 * exp2 * x
,即(x^(n/2))^2 * x
。这是因为x^n = (x^(n/2))^2 * x
当n
为奇数时。 - 如果
n
是偶数,则最终结果是exp2 * exp2
,即(x^(n/2))^2
。这是因为x^n = (x^(n/2))^2
当n
为偶数时。
2.4递归终止条件
除了上述的边界条件外,递归的终止还隐含在 n
不断减半的过程中。当 n
减小到 0 时,递归调用将返回 1,这是递归的基准情况。
2.5效率分析
这种分治方法的时间复杂度为 O(log n),因为它每次都将问题规模减半。与简单的迭代方法(如循环乘法)相比,这种方法在处理大指数时更加高效。
然而,需要注意的是,递归方法可能会消耗更多的栈空间,特别是当 n
非常大时。此外,由于递归深度可能很深,对于某些编译器或环境,可能存在栈溢出的风险。
小结:
关注我给大家分享更多有趣的知识,以下是个人公众号,提供 ||代码兼职|| ||代码问题求解||
添加我的公众号即可: