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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈延真 中级黑马   /  2013-6-6 23:01  /  2497 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 陈延真 于 2013-6-9 22:59 编辑

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

public static int f(int n) {
  if (n == 1 || n == 2) {
   return 1;
  } else {
   return f(n - 1) + f(n - 2) + f(n - 3);
  }
}
}

评分

参与人数 1技术分 +1 收起 理由
刘凯 + 1 加油

查看全部评分

7 个回复

倒序浏览
我先说递归使用的条件是什么
1. 基准情形:必须有某些基准情形,不用递归就能解决
2. 不断推进:就是对于那些要被递归的清形, 递归调用必须总能够朝着一个基准的情形推进。
现在 我按照毕向东老师的画图的方法  给你指一下你的问题:
见图
所以 就出现问题了

对于这样的含有递推公式的递归程序 你这样做你比较好
f(n) =f(n-1)+ f(n-2) +f(n-3)这个是递推公式吧

那么  你的起始项是不是n=1  所以 你这里面 是不是要
n-1 >=1
n-2>=1
n-3>=1
三个不等式取交集  得到的n的范围是 n>=4
所以 f(n) =f(n-1)+ f(n-2) +f(n-3)成立的条件必须是n>=4才能使用  那么 n<4 (n为整数)  也就是 n=1 n=2和n =3的时候  上面的递推公式不满足 你是不是要自己定义取值啊


f(1) =1
f(2) =1
f(3) =2
这三个值才叫基准值 你少定义了一个


我写了一下代码 你看看:
//求出这列数列的第20项的值:  1,1,2,4,7,13...
public class Demo {
        public static void main(String[] args) {
                System.out.print("f("+1+") ="+ f(1)+" ");
                System.out.print("f("+2+") ="+ f(2)+" ");
                System.out.print("f("+3+") ="+ f(3)+" ");
                System.out.print("f("+4+") ="+ f(4)+" ");
                System.out.print("f("+5+") ="+ f(5)+" ");
                System.out.print("f("+6+") ="+ f(6)+" ");
                System.out.print("f("+7+") ="+ f(7)+" ");
        }

        public static int f(int n) {
          if (n == 1 || n == 2)
           return 1;
          else if( n==3)
                  return 2;
          else
           return f(n - 1) + f(n - 2) + f(n - 3);
        }
}



xls.jpg (27.58 KB, 下载次数: 0)

你的递归出现的问题

你的递归出现的问题

result.jpg (14.64 KB, 下载次数: 0)

我运行的结果

我运行的结果

评分

参与人数 2技术分 +2 收起 理由
黑马伍哲沂 + 1 赞一个!给力解答。
刘凯 + 1 很给力!

查看全部评分

回复 使用道具 举报
  1. //求出这列数列的第20项的值:  1,1,2,4,7,13...
  2. public class DiguiDemo
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 System.out.println(f(5));
  7.         }

  8.         public static int f(int n)
  9.         {
  10.                 if (n == 1 || n == 2)
  11.                 {
  12.                         return 1;
  13.                 }
  14.                 else if (n==3)                                //少了一个初始条件
  15.                 {
  16.                         return 2;
  17.                 }
  18.                 else
  19.                 {
  20.                         return f(n - 1) + f(n - 2) + f(n - 3);
  21.                 }
  22.         }
  23. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
本帖最后由 刘晓 于 2013-6-7 08:58 编辑

问题出在:当n=3时,方法中的f(n-3)=f(0),而f(0)你没有在程序中声明出来,也没有f(0)这一项。因此你必须改成上面说的,你应该n从4取值。或者你也可以改成这样..........
  1. public class test
  2. {     
  3.         
  4.                 public static void main(String[] args) {
  5.                   System.out.println(f(20));
  6.                 }

  7.                 public static int f(int n) {
  8.                   if (n == 1 || n == 2)
  9. {
  10.       return 1;
  11. }
  12.                   else
  13. {
  14.       return f(n-1 ) + f(n-2 ) ;  //后面一项等于前面两项相加,那干嘛要来三个f()呢。俩足够!!!
  15. }
  16.                 }
  17.                 }
复制代码

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
张歆明 发表于 2013-6-7 00:13
我先说递归使用的条件是什么
1. 基准情形:必须有某些基准情形,不用递归就能解决
2. 不断推进:就是对于那 ...

也太牛了点。。。
回复 使用道具 举报
陈延真 发表于 2013-6-7 18:43
也太牛了点。。。

不客气 好  帮到你我很高兴
回复 使用道具 举报
这个递归类似斐波那契数列,算法很容易理解。
但是在使用递归的时候,就需要弄清楚需要指定数值的那些项,并将其全部赋值;
在这个递归程序中,楼主考虑情况时忽略了f(3)这个基础数据值;
由于没有指定f(0)的值,因而会出错。
在这里给楼主提几点小建议:
1函数命名时最好选择有异议的名字,养成好的习惯很重要哦;
2分条件时考虑全面一些,比方说 如果输入负数 或者是 0 ,应提示输入的数据错误;
相信楼主细心些就不会再出现类似的问题

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
楼主你好  如果帖子的问题已经解决,请把帖子的类型改为“已解决”。{:soso_e102:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马