0

所以我的任务是编写一个程序来确定一个数字是否平淡。意思是,如果你取一个数字:57,然后加上每个数字的平方,5*5 + 7*7,这就是现在的新数字:74。然后你一直这样做,直到你得到 58,这意味着这个数字不是平淡无奇的,或者你得到 1,这意味着这个数字是平淡的。58 只会重复一个总是以 58 结束的序列。

所以我想尝试一些基本的递归,但也许我误解了这里递归的使用。

以下是我写的两个相关方法:

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 回答