黑马程序员技术交流社区

标题: 关于递归问题 [打印本页]

作者: 许聪聪    时间: 2013-6-9 19:12
标题: 关于递归问题
  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
复制代码
知道哪里出错了 ,麻烦给看看
作者: 小冰块    时间: 2013-6-9 19:23
本帖最后由 小冰块 于 2013-6-9 19:48 编辑

n等于3的时候要手动return 2;
作者: 武志红    时间: 2013-6-9 19:34
你的代码有误,改成这样:
  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. }
复制代码
第三项也要作为递归结束的条件, 因为你是前三项相加
作者: 孙金鑫    时间: 2013-6-9 19:37
本帖最后由 孙金鑫 于 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:07
本帖最后由 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:}
作者: 刘晓    时间: 2013-6-9 20:41
之前不是有人问过这个问题么?http://bbs.itheima.com/forum.php ... mp;page=1#pid358478
作者: 杨增坤    时间: 2013-6-10 23:33
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)的情况,所以会出错!希望对你有所帮助!
作者: mvplee    时间: 2013-6-11 01:25
费布尼奇数列。。。。
作者: xiaohu1218    时间: 2013-6-11 16:51
本帖最后由 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;
        }

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

作者: 孙百鑫    时间: 2013-6-13 06:15
楼主您好!如果问题得到解决请将题目改成"已解决"
编辑文章-->修改 如果问题没有得到解决请继续发问谢谢您的配合




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