A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© qq8921310 高级黑马   /  2014-11-2 16:10  /  2721 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public static int test3(int num)
        {
                if (num>1)               
                test3(num/2);

                return num%2;
       
        }
我尝试了用StringBuffer 来接受返回的值,为什么始终都是只有0.难道这个函数,值只返回一次就结束了?

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

15 个回复

倒序浏览
毫无意义,中间的返回值你都没做处理,当然一直为0了。
               if (num>1)               
                test3(num/2);
返回了但又丢弃了
回复 使用道具 举报
递归只返回最后一次的值得 你可以定义个全局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.     }
复制代码
回复 使用道具 举报
楼主的意思是为什么只有一个返回值是吗?
如果是这样的话,那时因为虽然递归就是方法自己调用自己,但是除了最后一次,其余的时候,都没有读到return就重新调用这个方法了。
回复 使用道具 举报
也就是说,在满足num>1的条件时, 都是再一次的调用了test3方法,没有执行return语句,只有num>1不满足时,才执行了return语句,方法也结束了,所以只有一个返回值。
回复 使用道具 举报
郑飞 发表于 2014-11-2 19:02
递归只返回最后一次的值得 你可以定义个全局list来存放每次操作过的值

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

但是当上一句的return读完 就会读上一个方法的return。为什么记录不住呢?
回复 使用道具 举报
郑飞 高级黑马 2014-11-2 19:31:24
8#
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.     }
复制代码

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

回复 使用道具 举报
郑飞 高级黑马 2014-11-2 19:36:43
9#
本帖最后由 郑飞 于 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. }
复制代码

回复 使用道具 举报

我看出来我哪里有问题了。 应该是返回值类型一致不对,我用的int。
回复 使用道具 举报

我看出来我哪里有问题了。 应该是返回值类型一致不对,我用的int。
回复 使用道具 举报
qq8921310 发表于 2014-11-2 20:03
我看出来我哪里有问题了。 应该是返回值类型一致不对,我用的int。

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

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

返回值问题,不要返回值,直接打印就好了,也免得用StringBuffer,哈哈,这个问题很好,差点被绕进去
回复 使用道具 举报
楼主应该看看什么时候定义返回值,如果你想要得到方法的处理结果,那么一般就可以返回一个结果值,如果你不想得到那就不用设置为有返回值的,比如你只是想打印一个语句,那么在方法里面只要写输出语句就ok了,而不用返回什么值(返回了也没什么意义)。
回复 使用道具 举报
递归:关键是定义运算的结束标记,而正常的递归运算放在if条件语句之外
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马