2017-10-30 10 views
0

私は、数値がバイナリであるかどうかを評価するための再帰的な解法に取り組んできました。しかし、私のソリューションは常にfalseを返し、私は正しいロジックを得ることができません。私のコードは以下の通りです:2進数を再帰的に見つけるプログラム

public class Convert{ 
    public static boolean isBinaryNumber(int binary){ 
    int temp = 0; 
    boolean status = false; 

    if(binary==0 || binary==1) { 
     status = true; 
     return status; 
    } 
    else { 
     temp = binary%10; 

     if(temp == 1 || temp == 0) { 
      binary = binary/10; 
      isBinaryNumber(binary); 
     } 
     else { 
      status = false; 
      return status; 
     } 
    } 
    return status; 
    } 

    public static void main(String a[]){ 
    System.out.println("Is 1000111 binary? :"+ isBinaryNumber(1000111)); 
    System.out.println("Is 10300111 binary? :"+ isBinaryNumber(10300111)); 
    } 
} 

答えて

4
if(temp == 1 || temp == 0) { 
     binary = binary/10; 
     isBinaryNumber(binary); 
    } 

は、例えば、考慮に再帰呼び出しの戻り値を取る必要があります

if(temp == 1 || temp == 0) { 
     binary = binary/10; 
     status = isBinaryNumber(binary); 
    } 

コード全体をかなり圧縮することができます。たとえば、ステータス変数または初期リターン文を一貫して削除することができます。

ステータスを保持して明示的にすべてのケースをカバーしている場合は、初期化をfalseにしてコンパイラが欠落している割り当てを持つ分岐を指摘できるようにします。この場合、おそらくエラーの場所を指摘しているはずです。さらにいくつかの単純化して

、コードはあなたの再帰呼び出しの前にreturnを配置する必要があり

public static boolean isBinaryNumber(int binary) { 
     return binary == 1 || binary == 0 || binary >= 10 && 
      isBinaryNunber(binary/10) && isBinaryNumber(binary % 10) 
    } 
+0

ありがとうございます。あなたはそれがなぜなのかを説明することができますか? – Chognificent

+0

以前は、再帰呼び出しの結果を無視していました。ステータスへの割り当てにより、それが考慮され、返されます。 –

+1

"圧縮された"ソリューションはループしているので正しくありません。 – laune

1

に圧縮することができます。 最後のreturn文を削除した場合、残りのコードは正常に動作します。

しかし、私はいくつかの最適化を行いました(後述)。したがって、コードは次のようになります。あなたは、単に結果を返す代わりの値にし、それを返すよりも、それを保存することができますので、

public static boolean isBinaryNumber(int binary){ 
    if(binary==0 || binary==1) { 
     return true; 
    } 
    else { 
     int temp = binary%10; 
     if(temp == 1 || temp == 0) { 
      binary = binary/10; 
      return isBinaryNumber(binary); 
     } 
     else { 
      return false; 
     } 
    } 
} 

を私はまた、無用status変数を削除しました。