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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 田向向 高级黑马   /  2012-7-8 17:46  /  2349 人查看  /  11 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 田向向 于 2012-7-8 20:50 编辑

public class Test
{
        public static int a(int b){
             if(1>b){
                  return 0;
              }
             else{
                  return b---a(b);
              }
        }        
       public static void main(String[] args) {
            int n=a(10);
            System.out.println(n);
       }
}
这里为什么输出的是n=5,
我不明白这个b---a(b);是(b--)-a(b),还是b-(--a(b)),
当给b赋值10的时候, return b---a(b);这句话  10-a(10)是怎么计算的,是怎么循环的,

谁能给我讲一下这个程序的流程,谢谢

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

11 个回复

倒序浏览
本帖最后由 邵阳 于 2012-7-8 18:43 编辑

return b---a(b);
这个是什么符号,有什么作用,没见过啊。
我知道啦。先是一个-- 自减符号,再一个减号。
这样应该比较明确一些,如果传入的值为10的话,运算过程如下:  因为是b--所以代入10,b--还是10,下同。
第一次:

    b=10;
    b=10-a(9);     a(9)=9-a(8)
第二次
    b=9;
    b=9-a(8);        a(8)=8-a(7)
第三次
    b=8;
    b=8-a(7);         .....
    .
    .
    .
    b=2;
    b=2-a(1)          a(1)=1-a(0)=1
最后一次
    b=1;
    b=1-a(0)=1
然后你慢慢算吧,比较复杂,我省略啦。结果就是n=5.

今天刚看你答了了一个类似这个循环的题,你怎么自己糊涂啦。

点评

我主要是看见三个---就懵了,这是我的弱项,呵呵  发表于 2012-7-8 20:49
回复 使用道具 举报

本帖最后由 陈冲 于 2012-7-8 19:18 编辑

public class Test
{
        public static int a(int b){
             if(1>b){
                  return 0;
              }
             else{
                  return b---a(b);
/*
()的优先级大于--,因此b的自减是从最内层向外执行的,
这样应该比较明确一些,如果传入的值为10的话,运算过程如下:
第一次:
    return 10-a(9);
第二次
    return 10-(9-a(8));
第三次
    return 10-(9-(8-a(7)));
    .
    .
    .


结果为10-(9-(8-(7-(6-(5-(4-(3-(2-(1-0)))))))))=5

*/
              }
        }        
       public static void main(String[] args) {
            int n=a(10);
            System.out.println(n);
       }
}
回复 使用道具 举报
int a=1;
                int b=6;
                System.out.println(b---a);
                System.out.println(b);
测试一下就知道了  输出5 5  也就是说是(b--)-a;
这个属于优先级的问题  java的执行顺序是从左到右的  --的优先级大于-  所以懂了吧
至于递归 用你这个例子真不好讲  建议楼主不要把几个不会的问题放在一起起研究  可以把复杂的问题拆分成简单的问题去研究

点评

谢谢版主,我一看到三个加号三个减号什么的问题,我就懵,  发表于 2012-7-8 21:02
回复 使用道具 举报
本帖最后由 万宝东 于 2012-7-8 18:31 编辑

首先是算数运算符的优先级问题 :Java中的运算符按优先级从高到低排列如下:[ ] ( ) ++ -- ! ~ instanceof * / % + - << >> >>> <> < = > \ == != &^& & || ? := op= 。
所以 b---a(b);表示的是(b--)-a(b),
下面是递归,我花了一个图(看老毕视频真心提高画画水平 嘿嘿)
C:\Users\Administrator\Desktop\1.png

1.png (43.39 KB, 下载次数: 42)

1.png

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

回复 使用道具 举报
      public static int a(int b){
             if(1>b){
                  return 0;
              }
             else{
                  return b---a(b);//这个等式是从左边向右边计算的,b--后b就变成b-1,所以a(b)实际上是a(b-1),
这里的b是刚传进来未做处理的值。比如说你调用a(2),return  2---a(2-1)即1-a(1)

              }
        }
楼主以后要是遇到这种递归问题只要往里面带数字,从小往大的带就可以知道是怎么递归的:
数字           结果
1               0
2               1
3               1
4               2
。。。。。。
10             5
因此输出值是5
回复 使用道具 举报
找了好久  ,你们 看看这个 帖子吧
http://bbs.itheima.com/forum.php?mod=viewthread&tid=14428
回复 使用道具 举报
关于递归 建议你用这个例子去看看咯

public class test {

        public static void main(String[] args) {
                // TODO Auto-generated method stub
                System.out.println(diGui(3));
       
        }
        public static int diGui(int num){
                int sum=0;
                if(num==1) return 1;
                else return diGui(num-1)+2;
               
        }

}

1.png (12.71 KB, 下载次数: 44)

1.png
回复 使用道具 举报
陈冲 发表于 2012-7-8 18:23
public class Test
{
        public static int a(int b){

哥们你好多错的啊
回复 使用道具 举报
邵阳 发表于 2012-7-8 18:44
哥们你好多错的啊

刚才急着吃饭去了,快饿死了,帮我看看还有没有错的啊
回复 使用道具 举报
(x++) + x 和 x + (++x)虽然执行顺序上完全不一致,但是很神奇的是他们结果是一致的
10-a(9)
9-a(8)
8-a(7)
7-a(6)
6-a(5)
5-a(4)
4-a(3)
3-a(2)
2-a(1)
1-0      

2-1=1;
3-1=2;
4-2=2;
5-2=3;
6-3=3;
7-3=4;
8-4=4;
9-4=5;
10-5=5;
回复 使用道具 举报
我想得 对不对?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马