1.问题描述
编写一个递归算法,计算
m
n
m^n
mn
2.问题分析
通常计算
m
n
m^n
mn
时多采用循环连乘的方法,即把m连乘n次。这种方法的效率是很低的。现在使用一种更为有效的算法来计算整数的幂——递归法。
m
n
=
{
1
n
=
0
(
m
k
)
2
n
=
2
k
m
∗
(
m
k
)
2
n
=
2
k
+
1
m^n= \begin{cases} 1 & n=0 \\ (m^k)^2 & n=2k\\ m* (m^k)^2 & n=2k+1 \end{cases}
mn=⎩⎪⎨⎪⎧1(mk)2m∗(mk)2n=0n=2kn=2k+1
递归函数:
p
o
w
(
m
,
n
)
=
{
1
n
=
0
m
n
=
1
p
o
w
(
m
,
k
)
∗
p
o
w
(
m
,
k
)
n
=
2
k
m
∗
p
o
w
(
m
,
2
k
)
n
=
2
k
+
1
pow(m,n)= \begin{cases} 1 & n=0 \\ m & n=1\\ pow(m,k)*pow(m,k) & n=2k\\ m* pow(m,2k) & n=2k+1 \end{cases}
pow(m,n)=⎩⎪⎪⎪⎨⎪⎪⎪⎧1mpow(m,k)∗pow(m,k)m∗pow(m,2k)n=0n=1n=2kn=2k+1
3.代码
#include "stdlib.h"
#include <iostream>
using namespace std;
//求m的n次幂
unsigned long myPow(int m, int n)
{
unsigned long tmp;
if(n == 0) return 1;
if(n == 1) return m;
if(n % 2 == 0)
{
tmp = myPow(m, n/2);
return tmp * tmp;
}
if(n % 2 == 1)
return m * myPow(m, n-1);
}
int main(int argc, char* argv[])
{
cout << myPow(3,4);
system("pause");
return 0;
}
4.总结
注意:在本算法中,当n%2等于0时,用临时变量tmp来保存递归函数myPow返回的值,然后再返回tmp*tmp的值。只有这样才能真正体现该算法的优势,提高算法的效率。
本文介绍了如何使用递归法来高效地计算整数的幂。通过递归公式pow(m, n) = m*pow(m, n/2) (n为偶数) 和 pow(m, n) = m*m*pow(m, (n-1)/2) (n为奇数),实现了比传统循环更优的算法。在代码实现中,当n为偶数时,利用临时变量tmp保存递归结果并进行二次相乘,提高了算法效率。"
130471349,7305312,华为OD机试:Java实现日期到天数转换算法,"['Java', '开发语言', '算法', '华为', '编程挑战']

2381

被折叠的 条评论
为什么被折叠?



