我要实现如下功能,比如一个数字是199。第一步199--1+9+9=19  第二步 19--1+9=10  第三步 10--1+0=1
直到结果是个位数为止。
当然不用方法我做出来了。但是用了方法却碰到问题了,以下是我的代码public class Test {
public static int calculate(int num)
{
int sum=0;
while(num!=0)
{
sum+=num%10;
num/=10;
}
if(sum>=10)
{
num=sum;
calculate(sum);
}
return sum; 
}
public static void main(String[] args) {
int rlt=calculate(199);
System.out.println(rlt);
}
}我调试了下,进入三次递归是没有问题的,sum=1了。但是当return sum的时候,他居然又会跳到calculate(sum);这是为什么啊
然后居然把数字都改回来了。百思不得其解。求教各位
1.为什么会出现这种情况,其原理是?
2.应该怎么改才正确啊?

解决方案 »

  1.   

    while(num!=0)
            {
                sum+=num%10;
                num/=10;
            }It's not so good!   
      

  2.   

     
    calculate(sum); 改为return  calculate(sum);
      

  3.   


    public static int calculate(int num) {
    int sum = 0;
    while (num != 0) {
    sum = num % 10;
    num /= 10;
    }
    if (sum >= 10) {
    num = sum;
    calculate(num);
    }
    return sum;
    } public static void main(String[] args) {
    int rlt = calculate(199);
    System.out.println(rlt);
    }
      

  4.   


    public static int calculate(int num)
        {
            int sum=0;
            while(num!=0)
            {
                sum+=num%10;
                num/=10;
            }
            if(sum>=10)
            {
                num=sum;
                return calculate(sum);
            }
            return sum; 
        }
        public static void main(String[] args) {
            int rlt=calculate(199);
            System.out.println(rlt);
        }
      

  5.   

    谢谢,我知道要放return calculate(sum);了
    但是我更想知道的是
    当return sum的时候,他居然又会跳到calculate(sum);
    这是为什么
      

  6.   

    return calculate(sum); //跳入这个方法,并且返回值。
    calculate(sum); //调用这个方法,并且不返回。
      

  7.   


    public class Test {
      public static int calculate(int num) {
        int sum = 0;
        while (num != 0) {
          sum += num % 10;
          num /= 10;
        }
        if (sum >= 10) {
          num = sum;
          return calculate(num);
        } else {
          return sum;
        }
      }
      public static void main(String[] args) {
        int rlt = calculate(1253);
        System.out.println(rlt);
      }
    }
    要加上return 和判断语句。
      

  8.   

    程序是顺序执行的,
    if (sum >= 10) {
          num = sum;
          return calculate(num);
    }
    执行到这里的时候回调自身,但是你下面还有一个 
    return sum; 
    所以加上if else是正确的,写递归首先就要写好跳出递归的条件
      

  9.   

    你说的是第一次递归的return还是后面的?后面的递归调用当然要返回到调用这次递归的上一次递归那里去
      

  10.   


    public class Test {
        public static int calculate(int num)
        {
            int sum=0;
            while(num!=0)
            {
                sum+=num%10;
                num/=10;
            }
            if(sum>=10)
            {
                num=sum;
                sum = calculate(sum);
            }
            return sum; 
        }
        public static void main(String[] args) {
            int rlt=calculate(199);
            System.out.println(rlt);
        }
    }这样就对了!!
      

  11.   

        public static int calculate(int num)
        {
            int sum=0;
            while(num!=0)
            {
                sum+=num%10;
                num/=10;
            }
            if(sum>=10)
            {//当sum的值不只含有各位数的时候,进行递归调用,其递归返回值就是calculate方法的返回值。
                return calculate(sum);
            }
            return sum; //当sum只有各位数的时候,进行递归返回。
        }
        public static void main(String[] args) {
            int rlt=calculate(199);
            System.out.println(rlt);
        }楼主在debug的时候,可能会看到,多次的同名函数的调用,以及同名函数的返回。
    所以,在调试递归函数调用的时候,一定要抓住,什么时候进行的递归返回。
    该实例当中,return sum;这个语句就是递归返回的语句,当程序执行到这条语句的时候,整个函数进行递归返回。
    由于递归调用的语句,return calculate(sum);它会将调用的结果返回给上一层的调用,
    那么,最终的返回值,就应该是递归返回语句return sum;的值了。
      

  12.   

    楼主的写法有问题,主要错在calculate(sum);前面要加return,不加的话你再怎么递归也没用啊,它都会执行第一个return sum;这个sum不会因为calculate(sum)改变的,所以就是19拉
      

  13.   

    不加return 就不会递推返回指定的值(>=10)!