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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 许聪聪 中级黑马   /  2013-6-9 19:12  /  1635 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. //求出这列数列的第20项的值:  1,1,2,4,7,13...
  2. public class Demo {
  3. public static void main(String[] args) {
  4.   System.out.println(f(20));
  5. }

  6. public static int f(int n) {
  7.   if (n == 1 || n == 2) {
  8.    return 1;
  9.   } else {
  10.    return f(n - 1) + f(n - 2) + f(n - 3);
  11.   }
  12. }
  13. }
  14. public, return
复制代码
知道哪里出错了 ,麻烦给看看

评分

参与人数 1技术分 +1 收起 理由
黑马伍哲沂 + 1 鼓励个。

查看全部评分

9 个回复

倒序浏览
本帖最后由 小冰块 于 2013-6-9 19:48 编辑

n等于3的时候要手动return 2;

评分

参与人数 1技术分 +1 收起 理由
黑马伍哲沂 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
你的代码有误,改成这样:
  1. public class Demo {
  2.         public static void main(String[] args) {
  3.           System.out.println(f(100));
  4.         }

  5.         public static int f(int n) {
  6.           if (n == 1 || n == 2) {
  7.            return 1;
  8.           }else if(n==3){
  9.                   return 2;
  10.           }else {
  11.            return f(n - 1) + f(n - 2) + f(n - 3);
  12.           }
  13.         }
  14. }
复制代码
第三项也要作为递归结束的条件, 因为你是前三项相加

评分

参与人数 1技术分 +1 收起 理由
黑马伍哲沂 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
本帖最后由 孙金鑫 于 2013-6-9 19:41 编辑
  1. //求出这列数列的第20项的值:  1,1,2,4,7,13...
  2. public class Demo {
  3. public static void main(String[] args)
  4.         {
  5.   System.out.println(f(20));
  6. }

  7. public static int f(int n)
  8.         {
  9.   if (n == 1 || n == 2)
  10. {
  11.    return 1;
  12.   }
  13.   if(n==3)//这里一定要明确一下,否则的话,f(3)=f(2)+f(1)+f(0)....了,或者这样写,if(n==0) return 0;
  14.           return f(2)+f(1);

  15.    return f(n-1)+f(n-2)+f(n-3);
  16.   
  17. }
  18. }
复制代码
回复 使用道具 举报
本帖最后由 w270307032 于 2013-6-9 20:14 编辑
  1. 求出这列数列的第20项的值:  1,1,2,4,7,13...
  2. public class Demo {

  3.         /**
  4.          * @param args
  5.          */
  6.         public static void main(String[] args) {
  7.                 // TODO Auto-generated method stub
  8.                 System.out.println(f(7));
  9.         }

  10.         public static int f(int n) {
  11.                 if(n>0){
  12.                         if (n == 1 || n == 2) {
  13.                           
  14.                            return 1;
  15.                           }
  16.                           if(n==3)
  17.                                   return 2;
  18.                   
  19.                           else {
  20.                            return f(n -1) + f(n - 2)+f(n-3) ;
  21.                           }
  22.                         
  23.                           
  24.                 }
  25.                 else{
  26.                         
  27.                                 throw new RuntimeException("兄弟,你传错值了,栈溢出了");
  28.                 }
  29.         }
  30. }
复制代码
楼主要求的是前面三项的和,所以f(1),f(2),f(3)都得指定,还有必须n>0;要不就会出现楼主的栈溢出的情况,能到int的负数去。其实n如果太大的话也会溢出的,但这个上限就看你机子内存了,但上限不好界定,不要和自己的电脑过不去{:soso_e113:}

评分

参与人数 1技术分 +1 收起 理由
黑马伍哲沂 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
之前不是有人问过这个问题么?http://bbs.itheima.com/forum.php ... mp;page=1#pid358478
回复 使用道具 举报
public static void main(String[] args) {
                  System.out.println(f(20));
                }

                public static int f(int n) {
                  if (n == 1 || n == 2 || n==3) {
                   return 1;
                  } else {
                   return f(n - 1) + f(n - 2) + f(n - 3);
                  }
                }
如果不加n==3那当n==3的时候会报错的,以为f(n-3)中n-3=0而在这个方法中没有表明f(0)的情况,所以会出错!希望对你有所帮助!

评分

参与人数 1黑马币 +6 收起 理由
夜默 + 6 很给力!

查看全部评分

回复 使用道具 举报
mvplee 中级黑马 2013-6-11 01:25:09
8#
费布尼奇数列。。。。
回复 使用道具 举报
本帖最后由 xiaohu1218 于 2013-6-11 16:53 编辑

楼主你好,这个问题的算法思路很清晰:
前两项的数值均为1,
第三项的数值是前两项的和2,或者直接指定为2;
从第四项开始,每一项的数值均为其前面三项的数值之和;
这样一来就需要明确指定前三项的数值
而楼主只指定了前两项的准确值,忽略了f(3);
在计算到f(3)时,由于没有指定f(0),因此就出错了;
求值递归函数为
                public static int getnum(int n)        {
                if(n==1 || n==2)
                        return 1;
                if(n==3)
                        return getnum(n-1)+getnum(n-2);
                if(n>3)
                        return getnum(n-1)+getnum(n-2)+getnum(n-3);
                else
                        System.out.println("输入有误");
                return -1;
        }

另外为增加程序的完整性和可靠性,建议楼主加上输入数据的合法性判断,
如:输入负数时,提示用户输入的数据不合法。

评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1 很给力!

查看全部评分

回复 使用道具 举报
楼主您好!如果问题得到解决请将题目改成"已解决"
编辑文章-->修改 如果问题没有得到解决请继续发问谢谢您的配合
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马