2016-05-06 3 views
0

Я создаю метод рекурсии, который вычисляет базу логов 2. для журнала * (1) = должно быть 0. log * (4) = должно быть 2. но мой метод только распечатывает ноль и i не мог понять проблему. Может кто-нибудь мне помочь?Вычислить базу данных 2 рекурсию

public static int logCalculator(double n) { 
    if (n == 1) { 
     return 0; 
    } else { 
     return 1 + logCalculator(n * n); 
    } 
} 
+1

Как вы называете 'logCalculator'? EDIT: Кстати, обратите внимание, что ветка else приведет к переполнению стека, так как вы больше никогда не достигнете «return 0». – StepTNT

+4

'n * n' - это номер, с которым вы должны звонить. (А также, принимая аргумент 'double', тоже не поможет.) –

+3

Я смущен, если вы вызываете' logCalculator (4) ', вы не получите' 0', вы получите переполнение стека исключение, так как ваша рекурсия никогда не завершится. В этом отношении, как это когда-либо должно прекратиться? Никакое число, не равное единице, когда оно будет последовательно квадратным, никогда не сходится к одному. – azurefrog

ответ

0

Это будет работать на базе 2 бревна

public static int logCalculator1(double n) { 
    if (n < 2) 
     return 0; 
    return 1 + logCalculator1(n/2); 
} 

Примечание: это округление всегда и с большим числом является неточным, кроме того, вы можете сделать это для всех баз, как это:

public static int logCalculator(int base, double n) { 
     if (base > 0) { 
      if (n < base) { 
       return 0; 
      } else { 
       return 1 + logCalculator(base, (int)(n/base)); 
      } 
     } return 0; 
     } 
+0

, но можете ли вы поиграть в гольф? – svarog

+0

@svarog prob not –

+1

Это не сработает, если вы вызываете, скажем, 'logCalculator (1.5)'. Исправьте тип аргумента. –

Смежные вопросы