2016-04-19 3 views
0

Это популярный вопрос для интервью. Реализация моей собственной функции pow. Есть несколько популярных рекурсивных подходов, доступных онлайн, но я пытаюсь сделать это итеративно. Код работает для n> 0, но я немного теряюсь, когда он становится ниже 0. Вот мой код.Реализация моей собственной функции pow в Java

public double myPow(double x, int n) { 

     if(x == 0) return 0; 
     if(n == 0) return 1; 

     double result = 1; 
     if(n > 0){ 
      for(int i=1; i <= n; i++){ 
       result = result * x; 
      } 
     }else{ 
      for(int i=1; i<= n; i++){ 

       //calculate the nth root 
      } 
     } 

     return result; 
    } 

Любая помощь с оценкой n-го корня.

+2

Параметр 'n'th корень не тогда, когда' n' отрицательна; x^(- n) = 1/(x^n); корнем 'n'th является x^(1/n). – rgettman

+0

'myPow (0.0,0)' будет возвращать '0'. Это то, что вы хотите? Кажется, более целесообразно исключать исключение. – Gendarme

+0

@ rgettman Вы правы моей ошибкой. – Zeus

ответ

-1

Попробуйте это, я написал это, когда практиковал Java. Идея составляет 5^62 = 5^(32 + 16 + 8 + 4 + 2) = 5^32 * 5^16 * 5^8 * 5^4 * 5^2, а в двоичном коде 62 - 00111110.

Вот код:

double pow(double x, int n){ 
    int i; 
    double result; 
    result = 1; 
    i = x; 
    while(n != 0){ 
     if(n & 1 == 1){ 
      result *= i; 
     } 
     i *= i; 
     n>>1; 
    } 
    return result; 
} 
+0

Как уже упоминалось, я пытаюсь найти итерационное решение. Я знаю об этом рекурсивном варианте. – Zeus

+0

Извините за ошибку, я обновил свой ответ. @Зевс –

1

Я думаю, вы можете сделать это: (так как х^(- п) = 1/х^п)

double positive_pow(double x, int n) { 

     if(x == 0) return 0; 
     if(n == 0) return 1; 

     double result = 1; 
     if(n > 0){ 
      for(int i=1; i <= n; i++){ 
       result = result * x; 
      } 
     }else{ 
      for(int i=1; i<= n; i++){ 

       //calculate the nth root 
      } 
     } 

     return result; 
    } 

public double pow(double x, int n) { 
    if (n > 0) return positive_pow(x, n); 
    else if (n == 0) return 1; 
    else return 1/positive_pow(x, 0-n); 
} 

Это не самый короткий способ реализовать это, но он основан на вашей базовой функции, и это более понятно, чем рекурсивно вычислять его или возиться с функциями Math.

0

Это будет работать.

Этот код будет возвращать результат для отрицательных мощностей. Для объяснения я использовал переменную int p= x для моего расчета отрицательных степеней .....

public static double Pow(int x,int n){ 
    if(x == 0) return 0; 
    if(n == 0) return 1; 

    double result = 1; 
    if(n > 0){ 
     for(int i=1; i <= n; i++){ 
      result = result * x; 
     } 
    } 

    else{ 

     int p=x; 

     for(int i=0; i>n; i--){ 
      if(result==1){ 
       result= 1/(result*x); 
       result++; 
      } 

      else{ 
       p=p*x; 
       result= (1.0)*1/p; 
      } 

     } 
    } 
    return result; 
} 
Смежные вопросы