黑马程序员技术交流社区

标题: 递归 中返回的问题 [打印本页]

作者: qq8921310    时间: 2014-11-2 16:10
标题: 递归 中返回的问题
public static int test3(int num)
        {
                if (num>1)               
                test3(num/2);

                return num%2;
       
        }
我尝试了用StringBuffer 来接受返回的值,为什么始终都是只有0.难道这个函数,值只返回一次就结束了?
作者: wzg1015    时间: 2014-11-2 16:54
毫无意义,中间的返回值你都没做处理,当然一直为0了。
               if (num>1)               
                test3(num/2);
返回了但又丢弃了
作者: 郑飞    时间: 2014-11-2 19:02
递归只返回最后一次的值得 你可以定义个全局list来存放每次操作过的值
  1. public static void test3(int num,ArrayList list)
  2.     {
  3.             if (num>1)
  4.             {
  5.                     list.add(num%2);
  6.                     test3(num/2,list);
  7.             }
  8.     }
复制代码

作者: 姜浩    时间: 2014-11-2 19:03
楼主的意思是为什么只有一个返回值是吗?
如果是这样的话,那时因为虽然递归就是方法自己调用自己,但是除了最后一次,其余的时候,都没有读到return就重新调用这个方法了。
作者: 姜浩    时间: 2014-11-2 19:05
也就是说,在满足num>1的条件时, 都是再一次的调用了test3方法,没有执行return语句,只有num>1不满足时,才执行了return语句,方法也结束了,所以只有一个返回值。
作者: qq8921310    时间: 2014-11-2 19:19
郑飞 发表于 2014-11-2 19:02
递归只返回最后一次的值得 你可以定义个全局list来存放每次操作过的值

记录操作的值没有意义啊,这是二进制那个程序,需要记录%2 的值。但是我用Buffer 也是只有一个值、
作者: qq8921310    时间: 2014-11-2 19:21
姜浩 发表于 2014-11-2 19:03
楼主的意思是为什么只有一个返回值是吗?
如果是这样的话,那时因为虽然递归就是方法自己调用自己,但是除 ...

但是当上一句的return读完 就会读上一个方法的return。为什么记录不住呢?

作者: 郑飞    时间: 2014-11-2 19:31
qq8921310 发表于 2014-11-2 19:19
记录操作的值没有意义啊,这是二进制那个程序,需要记录%2 的值。但是我用Buffer 也是只有一个值、 ...

如果你要通过这种方法做那最后加个else把最后那个1加入集合 返回值你倒输出就是二进制了
  1. public static void test3(int num,ArrayList list)
  2.     {
  3.             if (num>1)
  4.             {
  5.                     list.add(num%2);
  6.                     test3(num/2,list);
  7.             }else
  8.             {
  9.                     list.add(1);
  10.             }
  11.     }
复制代码

作者: 郑飞    时间: 2014-11-2 19:36
本帖最后由 郑飞 于 2014-11-2 19:39 编辑
  1. package com.itheima.io;


  2. class Test
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 StringBuilder sb = new StringBuilder();
  7.                 test3(8,sb);
  8.                 System.out.println(sb.reverse());
  9.                
  10.         }

  11.         public static void test3(int num,StringBuilder sb)
  12.     {
  13.             if (num>1)
  14.                     test3(num/2,sb.append(num%2));
  15.             else
  16.                     sb.append(1);
  17.     }
  18. }
复制代码


作者: qq8921310    时间: 2014-11-2 19:57
郑飞 发表于 2014-11-2 19:36

我看出来我哪里有问题了。 应该是返回值类型一致不对,我用的int。
作者: qq8921310    时间: 2014-11-2 20:03
郑飞 发表于 2014-11-2 19:36

我看出来我哪里有问题了。 应该是返回值类型一致不对,我用的int。
作者: 郑飞    时间: 2014-11-2 20:13
qq8921310 发表于 2014-11-2 20:03
我看出来我哪里有问题了。 应该是返回值类型一致不对,我用的int。

嗯 递归尽量不用返回值 用形参存 或者用成员变量也行
作者: zxbzxb333    时间: 2014-11-2 20:16
qq8921310 发表于 2014-11-2 19:21
但是当上一句的return读完 就会读上一个方法的return。为什么记录不住呢?
...

是这样的,你递归了很多次,每一次都会有一个返回值num%2,但是一个函数只能有一个返回值,所以后面返回的值会把前面的给覆盖掉,最终函数返回的是最外面的test3(num)中的num%2=0这个值,它会把在它前面返回的值全都覆盖掉。而返回值也不会一直是0的,如果你把num值换成偶数的话就是0,如果你把num换成奇数的话就是1了。
作者: 王会涛    时间: 2014-11-10 09:47
qq8921310 发表于 2014-11-2 19:57
我看出来我哪里有问题了。 应该是返回值类型一致不对,我用的int。

返回值问题,不要返回值,直接打印就好了,也免得用StringBuffer,哈哈,这个问题很好,差点被绕进去
作者: 王会涛    时间: 2014-11-10 09:52
楼主应该看看什么时候定义返回值,如果你想要得到方法的处理结果,那么一般就可以返回一个结果值,如果你不想得到那就不用设置为有返回值的,比如你只是想打印一个语句,那么在方法里面只要写输出语句就ok了,而不用返回什么值(返回了也没什么意义)。
作者: zhangyangLengen    时间: 2014-11-10 12:12
递归:关键是定义运算的结束标记,而正常的递归运算放在if条件语句之外




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2