2016-06-11 3 views
0

私は2つの整数を受け入れる再帰関数を書き込みます。この関数は、最初の桁数が2番目の数値と等しい場合はtrueを返し、そうでない場合はfalseを返します。再帰java - テストは2つの整数の和です。ブール関数

この関数は常にtrueを返します。

私は間違っていますか?

コード:

public static boolean amountEqual(int num1, int num2) { 
    int sum1 = 0, sum2 = 0; 

    if (num1 == 0 && num2 == 0 && sum1 == sum2) 
     return true; 
    else if (num1 == 0 && num2 == 0 && sum1 != sum2) 
     return false; 

    sum1 += num1 % 10; 
    sum2 += num2 % 10; 

    return amountEqual(num1/10, num2/10); 
} 

感謝の

+0

2つの変数sum1とsum2の目的は何ですか? – tfosra

+0

それぞれの呼び出しは 'sum1'と' sum2'の独自のバージョンを持っています。あなたが呼び出し間で状態を共有することを望んでいない場合は、それを引数として渡します。グローバル/インスタンス変数を使用することを避けてください。 –

+0

sum1 =最初の数字のすべての桁の合計 Sum2 = 2番目の数字のすべての桁の合計 – liran

答えて

3

私が間違って何をしているのですか?

常に0であるsumを使用しています。 sum1sum2を渡す方法を見つけ出す必要があります。これにより、最後の呼び出しはすべての以前の呼び出しに基づいて決定できます。

それは四つのパラメータで再帰関数を作ることであること、および再帰的なチェーンを開始するために、2つのパラメータの過負荷を追加する一つの方法:

public static boolean amountEqual(int num1, int num2) { 
    return amountEqual(num1, num2, 0, 0); 
} 
private static boolean amountEqual(int num1, int num2, int sum1, int sum2) { 
    ... // your recursive code goes here 
} 

別のアプローチは、桁の差を計算することである、のすなわち合計num2の桁num1マイナス和の桁、および差分がゼロの場合trueを返す:

public static boolean amountEqual(int num1, int num2) { 
    return digitDifferential(num1, num2) == 0; 
} 
private static int digitDifferential(int num1, int num2) { 
    return (num1 != 0 || num2 != 0) 
    ? num1%10 - num2%10 + digitDifferential(num1/10, num2/10) 
    : 0; 
} 
+0

FWIW「num1」からの数字が「sum1」と「sum2」を1つのパラメータsumにスカッシュできます'sum'に加算され、' num2'からの数字は 'sum2'から減算されます。しかしそれはちょうどニックピッキングです。 –

+0

@MargaretBloomこれはとてもスマートなアイデアです!私は桁差分を計算し、それがゼロに戻ったときに「真」を返すという別のアプローチを提案した。ありがとう! – dasblinkenlight

+0

その2番目のアプローチは私がちょうど提案しようとしていたものですが、わずかな改善があります:num1 <10&num2 <10?を実行して最後の再帰呼び出し(およびそれに伴う余分なdiv/mod計算をスキップします) num1〜num2:...' – Andreas

0

まず第一に、あなたの質問は不明です。私は、両方の数値の桁の和が等しい場合に関数が真を返すようにすると仮定しました。

第2に、数字が同じ長さであると仮定していて、そうでない場合があります。

第3に、sum1sum2をパラメータとして渡すことはありません。

public static int digitSum(int num) { 
    if (num > 0) { 
     return num % 10 + digitSum(num/10); 
    } 
    else 
     return 0; 
} 

public static boolean amountEqual(int num1, int num2) { 
    return digitSum(num1) == digitSum(num2); 
} 
+0

'/''/'が必要なのはなぜですか? --- if(num <10)return num;を実行して再帰をスキップ – Andreas

+0

両方の数値の長さが等しいと仮定していません。コードは両方の数値がゼロ、真であるときに終了しますが、非有効数字はゼロであるため、異なる長さの数字が暗黙的にサポートされます。 –

+0

@アンドレアスおっと、そうです。編集されました。 – Marebre8

0

あなたのコードの最初の2行あなたはそれがゼロ を持つ2つの新しい変数を初期化 amountEqualメソッドを呼び出すたびに、あなたの再帰をトレースすることができます:

簡単なアプローチは、このように、二つの機能を作ることであろう

System.out.println(amountEqual(18,26)); 
     /* F(20,30) = F(18/10,26/10) [sum1 = 8 , sum2 = 6] 
      re init sum1 = 0 , sum2 =0 

      F(1,2) = F(1/10,2/10) [ sum1 = 1 , sum2 = 2] 
      re init sum1 = 0 , sum2 = 0 
        F(0,0) = true */