针对指数的数字的递归解决方案

时间:2014-02-14 04:40:48

标签: c++ algorithm recursion

嘿,我有一个问题,我必须以多种方式解决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它只返回基数。但是对于我的下一个,我必须使用三个公式解决它。

  • x 0 = 1
  • x n 如果n是偶数= [x n / 2 ] 2
  • x n 如果n为奇数= x * [x n / 2 ] 2

所以到目前为止我所拥有的是

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

1 个答案:

答案 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 == 4power == 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.我认为我的解释听起来有点奇怪,但希望它有所帮助。