黑马程序员技术交流社区

标题: 这样写代码为什么不行? [打印本页]

作者: 逝去的记忆ヽ    时间: 2012-6-24 22:18
标题: 这样写代码为什么不行?
本帖最后由 逝去的记忆ヽ 于 2012-6-25 21:46 编辑

代码如下:

public class Test {
    public static void main(String[] args) {
        System.out.println(fnn(40));
   
        //int a1 = 1;
        //int a2 = 2;
        //int a3 = 3;
        //int a4 = 4;
        //System.out.println(a4 + a3 + a2 + a1);
    public static int fnn(int n){
        if(n == 1 || n == 2) {
            return 1;
        }else {
            return fnn(n - 1) + fnn(n);
        }
    }
    }
}        

帮我分析下 如何解决
作者: 罗磊    时间: 2012-6-24 22:24
public class Test {
    public static void main(String[] args) {
        System.out.println(fnn(40));
   
        //int a1 = 1;
        //int a2 = 2;
        //int a3 = 3;
        //int a4 = 4;
        //System.out.println(a4 + a3 + a2 + a1);
   
    }
    public static int fnn(int n){
        if(n == 1 || n == 2) {
            return 1;
        }else {
            return fnn(n - 1) + fnn(n);
        }
    }
}        
这样写就好!你把函数写在了main函数里了!
作者: 张华廷    时间: 2012-6-24 22:46
public class Text2 {
        public static void main(String[] args) {
        System.out.println(fnn(40));
       //int a1 = 1;
        //int a2 = 2;
        //int a3 = 3;
        //int a4 = 4;
        //System.out.println(a4 + a3 + a2 + a1);
   
    }
   
        public static int fnn(int n){
        if(n == 1 || n == 2) {
            return 1;
        }else {
            return (n - 1) + n;//当n=40时,if语句不成立执行else语句,返回fnn(n-1)+fnn(n),返回的fnn()方法没有返回值所以会出现错误。
        }
    }
}
作者: 封明川    时间: 2012-6-24 22:46
能说下你要做什么吗?
是求递归吗?
作者: 张文强    时间: 2012-6-24 22:53
  1. public class Test {
  2.     public static void main(String[] args) {
  3.        // System.out.println(fnn(3));
  4.    
  5.         System.out.println(fnn2(3));
  6.         //int a1 = 1;
  7.         //int a2 = 2;
  8.         //int a3 = 3;
  9.         //int a4 = 4;
  10.         //System.out.println(a4 + a3 + a2 + a1);
  11.    
  12.     }
  13.         /* public static int fnn(int n){//第一个错误:fnn方法写在了main方法内;
  14.         if(n == 1 || n == 2) {
  15.                
  16.                         System.out.println("if");

  17.                         return 1;
  18.         }else {
  19.                         System.out.println("else");
  20.             return fnn(n - 1) + fnn(n);
  21.                
  22.         }
  23.         }
  24.         */
  25.         /*第二个错误:fnn方法中有调用fnn方法如果传入的值为3>=其结果和下面的程序一样,就相当于死循环,
  26.         总之哦不知道这个代码干啥用的*/
  27.          public static int fnn2(int n){
  28.         fnn2(n);
  29.                 return 2;
  30.         }
  31.    
  32. }        
复制代码

作者: 宋建华    时间: 2012-6-24 22:54
正确写法:

public class Test {
    public static void main(String[] args) {
        System.out.println(fnn(40));   
    }
     public static int fnn(int n){
                if(n == 1 || n == 2) {
            return 1;
        }
        else
         {       
            return (n-1) + n;
        }
    }
}   
======================
return fnn(n - 1) + fnn(n);
这样写会报错:at Test.fnn(Test.java:12)  输出40次。
作者: 伊文龙    时间: 2012-6-24 23:11
首先,你的代码除了效率低意外,没啥问题。
然后,你错误的原因不是你的代码,是你的思路。
     请问   fun(40)  =  fun(40) + fun(39)   也就是  fun(40) - fun(40)  = fun(39)!!!???????你矛盾吗?    你觉得这样写有意义吗?
我想楼主应该知道怎么解决这个递归的问题了吧。

顺便我说说我对递归的建议,希望对你有帮助
我感觉使用递归要考虑3点:
1.递归结束条件。我认为这是最主要的,没有递归结束条件的递归,就是死循环
2.递归调用条件。很明显,调用递归的入口。
3.递归的效率问题。如果使用楼主这种递归思路。效率非常低。很多数会重复计算。

作者: 吴小东    时间: 2012-6-25 01:25
本帖最后由 吴小东 于 2012-6-25 01:34 编辑

/*首先我想说的是,哥们你这代码的格式真的是乱七八糟的,连大括号的配对都有问题,
还有你想问什么问题,能不能给点清晰的东西,
丢一段代码出来,帮忙分析下为什么不行。。。着提问的方式也太敷衍了吧, 做事情要对自己负责任
*/
/*
  第一个问题,你的main函数里面,大括号的配对有问题
  第二个问题,你的这个递归fnn(n - 1) + fnn(n) 我是没想出来,你是想做到一个什么效果
     这个程序除非传入的参数 是1 或者 2,否者他是停不下来的。下面用代码注释说明
  第三个问题,递归要注意考虑你的内存问题,而且像你这样递归里面还是两次调用函数,就算是能运行也是不可取的
*/
public class TT
{
    public static void main(String[] args)
    {
       System.out.println(fnn(3));//修改参数为3传入
    }
    public static int fnn(int n) //-->此处传入 3
   {
        if(n == 1 || n == 2) //不满足条件进入else
          {
            return 1;
         }else
         {
            return fnn(n - 1) + fnn(n);
                   /*
                   主要的问题是 fnn(n),我把你前面的 fun(n-1) 去掉 就是
                   return fun(n);这会是个什么情况-->每次3进来 又 return fun(3);-->然后进入下一个 又是 fun(3) 又return fun(3);
                   这已经是一个死循环了,只有强制结束。
                   */
                  /*return fun(n-1); 单单使用是 OK 的没有问题
                   不过如果这样写了,那么你传入的参数必须是大于1的数,如果传入的是负数的话那么也会进入无限循环
                   */
        }
    }
}
为什么,复制代码还需要自己调格式,纠结

作者: 伊文龙    时间: 2012-6-25 10:17
伊文龙 发表于 2012-6-24 23:11
首先,你的代码除了效率低意外,没啥问题。
然后,你错误的原因不是你的代码,是你的思路。
     请问   fu ...

谢谢!!黑马一定见!
作者: 游洪波    时间: 2012-6-25 10:54
public class Test {
    public static void main(String[] args) {
        System.out.println(fnn(40));
   
       public static int fnn(int n){
        if(n == 1 || n == 2) {
            return 1;
        }else {
            return fnn(n - 1) + fnn(n);
        }
    }
    }
}
你的错误首先是 在main方法中是不可以再定义其他方法的 ,其他方法必须定义到main方法之外
public class Test {
    public static void main(String[] args) {
        System.out.println(fnn(40));
   
        }
   public static int fnn(int n){
        if(n == 1 || n == 2) {
            return 1;
        }else {
            return fnn(n - 1) + fnn(n);
        }
    }

}
其次你的 return funn(n-1)+fnn(n)后边的funn(n)是没有任何意义的funn(n)如果单独运行的话那就是一个死循环所以你应该还要这么改

public class Test {
    public static void main(String[] args) {
        System.out.println(fnn(40));
   
        }
   public static int fnn(int n){
        if(n == 1 || n == 2) {
            return 1;
        }else {
            return fnn(n - 1);
        }
    }

}
但是这样改动画存在一个问题就是当你的n为负数或等于0的时候也会掉入死循环,这样的设计是很不合理的所以你要在前边加个判断条件
public class Test {
    public static void main(String[] args) {
        System.out.println(fnn(40));
   
        }
   public static int fnn(int n){
        if(n == 1 || n == 2|| n<=0) {
            return 1;
        }else {
            return fnn(n - 1);
        }
    }

}
这样写就可以了 ,因为今天在网吧,没有JDK所以没法帮你调试
作者: 游洪波    时间: 2012-6-25 10:54
public class Test {
    public static void main(String[] args) {
        System.out.println(fnn(40));
   
       public static int fnn(int n){
        if(n == 1 || n == 2) {
            return 1;
        }else {
            return fnn(n - 1) + fnn(n);
        }
    }
    }
}
你的错误首先是 在main方法中是不可以再定义其他方法的 ,其他方法必须定义到main方法之外
public class Test {
    public static void main(String[] args) {
        System.out.println(fnn(40));
   
        }
   public static int fnn(int n){
        if(n == 1 || n == 2) {
            return 1;
        }else {
            return fnn(n - 1) + fnn(n);
        }
    }

}
其次你的 return funn(n-1)+fnn(n)后边的funn(n)是没有任何意义的funn(n)如果单独运行的话那就是一个死循环所以你应该还要这么改

public class Test {
    public static void main(String[] args) {
        System.out.println(fnn(40));
   
        }
   public static int fnn(int n){
        if(n == 1 || n == 2) {
            return 1;
        }else {
            return fnn(n - 1);
        }
    }

}
但是这样改动画存在一个问题就是当你的n为负数或等于0的时候也会掉入死循环,这样的设计是很不合理的所以你要在前边加个判断条件
public class Test {
    public static void main(String[] args) {
        System.out.println(fnn(40));
   
        }
   public static int fnn(int n){
        if(n == 1 || n == 2|| n<=0) {
            return 1;
        }else {
            return fnn(n - 1);
        }
    }

}
这样写就可以了 ,因为今天在网吧,没有JDK所以没法帮你调试




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