2017-01-09 8 views
-4

/loopを使用せずに以下を変換します。再帰を使用することもできます。& &、||等...if/loopを使用せずにこのjavaメソッドを変換する

public boolean mystery(int n){ 

if(n == 0){ 
    return false; 
} 
if(n%10 == 7){ 
    return true; 
} 
    return mystery(n/10) 

} 

私はヒントをしたいと思います。

しかし、私は実験してきました。

は、私たちは、第二部がtrueの場合true && false == falseのみtrue && true == true

だから私たちは、その後、

return (n%10 == 7) && .... 

が続いて第二部のために、我々は真または偽の取得、および可能性のいずれかのことを持っていなければならないことを知っています私たちの最初の部分が真実であればすべてが真実になるので、私は考えています。

return (n%10 == 7) && ... 

しかし、私は問題は右のそのバットオフのn%10ありえない7場合は、すべてが虚偽であることかもしれません考えています。

+0

あなたは別の三元表現 'リターンconittion真含めるように三元式の2番目の部分を使用することができます:真の条件:??偽の;' – SomeJavaGuy

+4

私は推測してみましょう:あなたのクラスは( '条件演算子を勉強してきましたか? : '、三項演算子と呼ばれることもありますが、技術的には* a *三項演算子です)最近... –

+1

'return n> = 0 && Integer.toString(n).contains(" 7 ");' –

答えて

0

は多くの方法があります:あなたのスタートを与えることではなく:

if(n == 0){ 
    return false; 
} 
if(n%10 == 7){ 
    return true; 
} 
    return mystery(n/10) 

} 

return n==0 ? false : n%10==7 ? true : mystery(n/10); 

と同等です

return n!=0 ? n%10==7 ? true : mystery(n/10): false; 

と同等であることは

return n!=0 && n%10!=7 ? mystery(n/10) : n!=0; 
に相当します
1

私の見解では、三項演算子は依然として「if」文ですが、それは意味論的な議論になります。完全に使用することは避けることができます。

return (n % 10 == 7) || (n != 0 && mystery(n/10)); 
+0

これをどのように導き出したか説明できますか? – user7361276

+0

まず、n%10が7に等しい場合、コードを直ちにtrueに戻したいので、最初の文が真の場合、ORの2番目の部分は評価されません(式全体がtrue )。それ以外の場合、nが0に等しい場合、ANDの最初の部分はfalseを返し、2番目の部分は評価されません(式は偽であることが保証されるため)。 nがゼロでない場合、このメソッドは単に再帰的に自身を再度呼び出します。それは理にかなっていますか? –

0

解決する興味深いアクティビティでしたか?以下の解決策は、10kまでのテストの証明付きです。 mystery2があなたにとって興味のある方法です。私は解決策だどのように

は、0から100までの結果を印刷開始し、パターンを識別は - 起動または真と他のすべてfalseを返します7で終わるものを見つけました。ゼロと比較される最初のifブロックは、実際にはの任意の位置のリマインダー7ルールを満たさないすべての数字によって遭遇します。したがって、リマインダ7は真の結果を得るための唯一の条件であり、ユニットの位置が完了した後は0になるまで他のすべてが再帰に入る。再帰を終了する条件(または、StackOverflowExceptionで終わる)が必要であるため、0に等しい値が必要です。

public static void main(String[] args) { 
    for(int i = 0 ; i<=10000; i++){ 
     if(mystery(i) != mystery2(i)){ 
      System.out.println("Mismatch... "+i); 
     } 
    } 
} 

static boolean mystery(int n) { 
    if (n == 0) { 
     return false; 
    } 
    if (n % 10 == 7) { 
     return true; 
    } 
    return mystery(n/10); 
} 

static boolean mystery2(int n) { 
    return n % 10 == 7 || (n != 0 && mystery2(n/10)); 
} 
関連する問題