嘿,我有一个问题,我必须以多种方式解决x ^ n。其中一个涉及使用递归公式,它给我一个艰难的时间。因此,对于n> = 0
,我使用递归x ^ n的方法之一int power2(int base, int power){
if (power == 0)
return 1;
else if ( power == 1)
return base;
else
return (base * power2(base, power - 1));
}
这对我有意义所以当我设置X = 2和N = 4时,它正在降低功率,它充当计数器,并且将2x2功率提升到3,4 * 2,功率提升到2, 8 * 2 = 16.比功率提高到1,我有一个基本情况,如果功率提高到1它只返回基数。但是对于我的下一个,我必须使用三个公式解决它。
所以到目前为止我所拥有的是
int power3(int base, int power){
if(power == 0){
return 1;
}
else if ( power == 1)
return base;
// if power is even
if (power % 2 == 0){
return base*(power3(base,(power/2)));
}
// if power is odd
else{
return 0;
}
}
所以我只是试着让偶数数字首先工作,当我设置x = 2和n = 4时它返回8.这对我来说是有道理的,因为当功率为4/2时只会循环两次大于1。所以我真的想找到一种方法让这个循环再次循环,同时坚持我给出的公式。当我添加奇数基本情况现在程序将工作直到n ^ 5但n ^ 6返回32
答案 0 :(得分:4)
你对公式的解释有点问题
x^n if n is even = [x^n/2]2
并不意味着:
base*(power3(base,(power/2))) //meaning x * [x^n/2]
而不是你有
(power3(base,(power/2))) * 2
再次查看你的公式它甚至不正确,应该是x^n if n is even = [x^n/2]^2
代码:
(power3(base,(power/2))) * (power3(base,(power/2)))
或:
(power3(base * base,(power/2)))
你的整个功能应该是这样的:
int power3(int base, int power){
if(power == 0){
return 1;
}
else if ( power == 1) // you don't really need this case,
return base; // power == 0 is enough as base case
// if power is even
if (power % 2 == 0){
return (power3(base * base,(power/2)));
}
// if power is odd
else{
return base * (power3(base * base,(power/2)));
}
}
好的,因为你似乎仍然对奇怪的力量感到困惑
您的power
变量为int
,因此您得到整数除法,意味着3/2 = 1而不是1.5(小数点后面的所有内容都会被截断)。
现在让我们看看函数中的奇怪情况:
return base * (power3(base * base,(power/2)));
让我们假设base == 4
和power == 5
return 4 * (power3(4 * 4,(5/2))); // 5/2 evaluates to 2
与说return 4 * (power3(4, 5 - 1))
相同
然后返回(power3(4 * 4, 4 /2))
,因为我们现在得到了一个偶数案例。
我们基本上只做这两个步骤为1.我认为我的解释听起来有点奇怪,但希望它有所帮助。