Recursive power function: approach

后端 未结 9 1155
北恋
北恋 2020-12-18 15:24

I\'m programming for a while now(beginner), and recursive functions are a somewhat abstract concept for me. I would not say I\'m stuck, program works fine, I\'m just wonderi

相关标签:
9条回答
  • 2020-12-18 15:39

    Simple but does n number of multiplications. Above examples are more efficient because they group two operations in one iteration

    int power(int x, int n)
    {
        if (n == 0) return 1;
    
        return x * power(x, n-1);
    }
    
    0 讨论(0)
  • 2020-12-18 15:41

    When rewriting your function, don't lose sight of the main benefit of recursion in this case, which is to reduce the number of multiplication operations required. For example, if n = 8, then it is much more efficient to compute x * x as val1, then val1 * val1 as val2, and the final answer as val2 * val2 (3 multiplications) than to compute x * x * x * x * x * x * x * x (7 multiplications).

    This difference is trivial for small integers but matters if you put this operation inside a big loop, or if you replace the integers with very large number representations or maybe ginormous matrices.

    Here's one way to get rid of the pow() function without getting rid of the recursion efficiency:

    #include<stdio.h>
    #include<math.h>
    
    int power(int, int);
    
    int main(void)
    {
        int x, n;
        printf("Enter a number and power you wish to raise it to: ");
        scanf_s("%d %d", &x, &n);
        printf("Result: %d\n", power(x, n));
        return 0;
    }
    
    int power(int x, int n)
    {
        int m;
        if (n == 0) return 1;
        if (n % 2 == 0) {
            m = power(x, n / 2);
            return m * m;
        } else return x * power(x, n - 1);
    }
    
    0 讨论(0)
  • 2020-12-18 15:46

    For the power function (let's say, x to the nth power) you have two cases:

    exponent=0
    exponent=n
    

    For the first case, you only need to return 1. In the other case, you need to return x to the power of n minus one. There, you only used the function recursively.

    int power(int x, n)
    {
        if(n == 0) return 1;
        else return x * power(x, n-1);
    }
    
    0 讨论(0)
  • 2020-12-18 15:47

    My approach with C++, works only with non-negative numbers.

    #include <iostream>
    using namespace std;
    
    long long  power(long long x, long long y) {
    if (y == 0) {
        return  1;
    }
    else {
        y--;
        return x*power(x,y);
     }
    }
    main() {
    long long n, x;
    cin >> n >> x;
    cout << power(n,x);
    }
    
    0 讨论(0)
  • 2020-12-18 15:49

    The code:

    int power(int x, int n)
    {
        if (n == 0) return 1;
        if (n % 2 == 0) return power(power(x, n / 2), 2);
        else return x * power(x, n - 1);
    }
    

    does not work because when n is even power is called with n = 2 which is even and then power is called with n = 2 which is even and then power is called with n = 2 ... until ... stack overflow!

    Simple solution:

    int power(int x, int n)
    {
        if (n == 0) return 1;
        if (n % 2 == 0) {
            if (n == 2) return x * x;
            return power(power(x, n / 2), 2);
        }
        else return x * power(x, n - 1);
    }
    
    0 讨论(0)
  • 2020-12-18 15:50

    Here is a solution in ruby which works for negative exponents as well

    # for calculating power we just need to do base * base^(exponent-1) for ex:
    # 3^4 = 3 * 3^3
    # 3^3 = 3 * 3^2
    # 3^2 = 3 * 3^1
    # 3^1 = 3 * 3^0
    # 3^0 = 1
    
    # ---------------------------------------------------------------------------
    # OPTIMIZATION WHEN EXPONENT IS EVEN
    # 3^4 = 3^2 * 3^2
    # 3^2 = 3^1 * 3^1
    # 3^1 = 3^0
    # 3^0 = 1
    # ---------------------------------------------------------------------------
    
    def power(base, exponent)
      if(exponent.zero?)
        return 1
      end
      if(exponent % 2 == 0)
        result = power(base, exponent/2)
        result = result * result
      else
        result = base * power(base, exponent.abs-1)
      end
    
      # for handling negative exponent
      if exponent < 0
        1.0/result
      else
        result
      end
    end
    
    # test cases
    puts power(3, 4)
    puts power(2, 3)
    puts power(0, 0)
    puts power(-2, 3)
    puts power(2, -3)
    puts power(2, -1)
    puts power(2, 0)
    puts power(0, 2)
    
    0 讨论(0)
提交回复
热议问题