2016-05-06 4 views
0

ログベース2を計算する再帰メソッドを作成しています。log *(1)= 0にする必要があります。log *(4)= 2でなければなりません。問題を理解できませんでした。誰かが私を助けますか?ログベース2の再帰を計算する

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

どのように 'logCalculator'を呼びますか?編集:ところで、あなたは決して 'return 0'に達することはないので、elseブランチはスタックオーバーフローにつながることに注意してください。 – StepTNT

+4

'n * n'はこれを呼び出すべき番号ではありません。 (また、 'double'引数を取っても助けにならないでしょう) –

+3

' logCalculator(4) 'を呼び出すと' 0'が得られません。混乱します。スタックオーバーフローが発生しますあなたの再帰は決して終了しないので、例外です。それについては、これまでどのように終了するはずですか?連続して二乗すると、非1の数は決して1に収束しません。 – 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なし –

+1

これは、 'logCalculator(1.5)'と呼ぶとうまくいかないでしょう。引数の型を修正してください。 –

関連する問題