黑马程序员技术交流社区

标题: 对程序结果很迷惑??? [打印本页]

作者: lantian    时间: 2012-7-8 14:43
标题: 对程序结果很迷惑???
本帖最后由 lantian 于 2012-7-8 20:07 编辑

public class Test {
         static int T(int x)
        {

               return x==0?0:x+T(x-1);

        }
        public static void main(String args[]) {

              System.out.print(Test.T(50));

       }


根据我自己的理解,判断后x!=0,所以打印的x应该是49啊,怎么会是1275呢,x==0?0:x+T(x-1)是什么意思?
作者: 田向向    时间: 2012-7-8 14:49
这应该属于递归算法。return x==0?0:x+T(x-1);这句话中的T(x-1)应该是递归调用,它调用的是它自己本身的静态方法,当给x赋值50时,根据判断,x!=0,所以将x+T(x-1)值返回,即返回50+T(49),就相当于此时x的值等于49,然后再进来运算,直到x=0为止。
其实他的性质就跟下面两个代码差不多。

                int sum=0;
                for(int x=50;x>=0;x--)
                {
                        sum=sum+x;
                }
                System.out.println(sum);

                int x=50,sum=0;
                if(x>=0)
                {
                        sum=sum+x;
                        x--;
                }
                System.out.println(sum);

其实也挺简单的,自己好好琢磨琢磨就懂了,

我也是根据自己的理解,哪位高手要是发现我说的有什么不对的地方的话,还请赐教,,谢谢喽

只要能帮到你,手累也值了。

作者: 曹恒业    时间: 2012-7-8 14:51
public class Test {
         static int T(int x)
        {

               return x==0?0:x+T(x-1);

        }
        public static void main(String args[]) {

              System.out.print(Test.T(50));

       }


这是个递归调用,
第1次,x是50,判断不等于0,则返回x+T(x-1),即50+T(49)。但是T(49)不是确定的值,还需要调用函数T()。
所以,Test.T(50)实际上是求50+49+48+。。。+2+1+0的和,根据求和公式,最后返回的值就是1275.
x==0?0:x+T(x-1)是什么意思?
这是三元运算符,原型是, 表达式1?表达式2:表达式3。
当表达式1的boolean值是true时,返回表达式2的值,当为false时,返回表达式3的值。
希望有帮到你~~有疑问可以再M我

作者: lantian    时间: 2012-7-8 14:52
呵呵!谢谢。。。。。。。。。。
作者: 邵阳    时间: 2012-7-8 14:54
class Test
{
         static int T(int x)
        {
               return (x==0)?0:x+T(x-1);
        }
        public static void main(String args[])
   {
              System.out.print(Test.T(50));
       }
}
你这里面构造成了循环,红色的标示出了。
一直到x=0时循环才结束。
50+49+48+........+5+4+3+2+1+0=1275

作者: 梁健生    时间: 2012-7-8 15:04
public class Test {
static int T(int x)
{

return x==0?0:x+T(x-1) ; //这里 你已经运行了递归调用,T(x-1) =x+T((x-1)-1)......+0
//return x == 0? 0 : (x-1);  //这样修改结果才能是49。

}
public static void main(String args[]) {

System.out.print(Test.T(50));

}


根据我自己的理解,判断后x!=0,所以打印的x应该是49啊,怎么会是1275呢,x==0?0:x+T(x-1)是什么意思?
作者: 梁健生    时间: 2012-7-8 15:06
本帖最后由 梁健生 于 2012-7-8 18:40 编辑


脑子热糊涂了,请越过 看下边的!!!
作者: 梁健生    时间: 2012-7-8 18:39
梁健生 发表于 2012-7-8 15:06
哥们 你理解错了~~~   1+.....+50 不可能等于1275的!!

我擦 太热了 ,脑子都乱了 !!找个角落蹲着去~~~~:'(
作者: 高原    时间: 2012-7-8 19:44
这是个函数递归调用的问题,即:函数自己调用自己
楼主程序中计算的是T(50),为了演示方便,我是用T(3)来画个图演示函数的调用过程,如图所示
过程就是这个样子,T(50)也是一样的,只是函数调用的次数多一些
另外,递归一定要有结束的标记,如程序中的x==0,否则会出现栈溢出

1.png (15.17 KB, 下载次数: 18)

1.png





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