0

そのため、数値が味気ないかどうかを判断するプログラムを作成する任務を負っています。つまり、たとえば 57 という数字に、各桁の 2 乗を足すと、5*5 + 7*7 となり、新しい数字は 74 になります。そして、数字が味気ないことを意味する58を取得するか、数字が味気ないことを意味する1を取得するまで、それを続けます。58 は、常に 58 で終わるシーケンスを繰り返すだけです。

だから私はいくつかの基本的な再帰でそれを試みたかったのですが、おそらくここでの再帰の使用を誤解しています.

私が書いた2つの関連するメソッドは次のとおりです。

public static boolean insipid(int num){

    int dig1 = 0, dig2 = 0, dig3 = 0; // num = 159 for example, dig1 would be 1. Default is 0 in case of a 2 digit number, dig1*dig1 = 0
    if(num == 58){ //The number is not insipid
        return false;
    }
    if(num == 1){ // the number is insipid
        return true;
    }

    if (num < 10){
        insipid(num * num);
    }
    if(num>99){
        dig1 = (int)(num / 100);
        dig2 = (int)((num - 100)/10);
        dig3 = num - (((int)(num / 10))*10);
        insipid(squaresum(dig1,dig2,dig3));
    }
    else{
        dig2 = (int)(num/10); //the 10s place
        dig3 = num - (((int)(num/10)) * 10); // the 1's place
        insipid(squaresum(dig1, dig2,dig3)); //dig1 = 0 so I just pass it along with it.
    }
}

public static int squaresum(int dig1, int dig2, int dig3){
    //Returns the sum of three digits squared.
    return (dig1 * dig1) + (dig2 * dig2) + (dig3 + dig3);
}

Insipid() は、数値を指定するたびにブール値を返さなければならないというエラーが表示されます。しかし、与えられた数値は常に最終的に 58 または 1 に解決されることを知っています。したがって、ブール値が返され、エラーが無効になるように、常に true または false が返されるべきではありませんか? 明らかにこれは事実ではありませんが、私はそれをどのように見ていますか。ここでの再帰の使用は無効ですか?

また、これをクリーンアップする方法について何か提案があれば、厳しい批判を気にしません。私の Java はあまり良くありません。

4

3 に答える 3

2

ソリューションを使用した場合、欠けているのは への再帰呼び出しからの return ステートメントだけですincipid

于 2012-10-12T02:04:40.850 に答える
1

以下のようにあなたを無味乾燥に更新してください。で宣言されたメソッドはreturn、すべての場合に値を返す必要があります。それ以外の場合、つまり数値が1と58以外の場合、メソッドは値を返しません。

public static boolean insipid(int num){
  boolean returnValue = false;
  if(num == 58){ //The number is not insipid
   //do nothing
  } if(num == 1){ // the number is insipid
    returnValue = true;
  }else{
    int dig1 = 0, dig2 = 0, dig3 = 0; // num = 159 for example, dig1 would be 1. Default is 0 in case of a 2   digit number, dig1*dig1 = 0
    if (num < 10){
        returnValue = insipid(num * num);
    }
    else if(num>99){
        dig1 = (int)(num / 100);
        dig2 = (int)((num - 100)/10);
        dig3 = num - (((int)(num / 10))*10);
        returnValue = insipid(squaresum(dig1,dig2,dig3));
    }
    else{
        dig2 = (int)(num/10); //The 10s place
        dig3 = num - (((int)(num/10)) * 10); //the 1s place
        returnValue = insipid(squaresum(dig1, dig2,dig3)); //dig1 = 0 so I just pass it along with it.
    }
  }
  return returnValue ;
}

注意してください: 私は返品の問題のみに関するあなたの問題に答えようとしました.

于 2012-10-12T02:04:10.257 に答える
0

Yogendra Singhの答えに加えて、あなたは間違って数字を計算しています:例えば

dig2 = (int)((num -100)/10);

百の位は1であると想定しています。試してください

dig2 = (int)((num - dig1 * 100)/10);

同様にdig3

于 2012-10-12T02:10:55.133 に答える