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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© FFF 金牌黑马   /  2013-10-19 11:43  /  1082 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 FFF 于 2013-10-19 13:38 编辑
  1. public class Temp10_19
  2. {
  3.         public static void main (String[] args)
  4.         {
  5.                 System.out.println("用循环实现求 n! 的结果(n=4):"+f1(5));
  6.                 System.out.println("用递归实现求 n! 的结果(n=4):"+f2(5));
  7.         }
  8.         static long f1(int n)
  9.         {
  10.                 long k=1;
  11.                 for(int i=1;i<=n;i++)
  12.              k*=i;
  13.                 return k;
  14.         }
  15.         static long f2(int n)
  16.         {
  17.                 if(n==1)  return 1;
  18.                 else     return n*f2(n-1);//这句不明白,请给我详细讲解一下!谢谢
  19.         }
  20. }
复制代码
后一句里的递归不太理解,请对递归理解比较深的同学给我注解注解。谢谢!

评分

参与人数 1技术分 +1 收起 理由
李江 + 1 很给力!

查看全部评分

4 个回复

倒序浏览
我总结的递归三个条件是:
1.具有返回值,且返回类型跟参数类型相容.
2.具有结束条件.
3.自身调用.
我觉得递归就是,不断地自身调用自身,但是不能没完没了,那样就成了死循环了,就是必须有结束条件,让它跳出循环。(一般来说跳出循环的体就是直接return一个返回值)
你需要一个可以找到规律的循环条件,并且在循环体里要做的同一件事情,这时候可以用递归来实现,这是我的想法
本例中: 你的if(n==1)  return 1; 是结束条件,因为f 函数传入的参数一直在减小,所以达到n = 1时 递归就结束了,这时的运算结果就是n 的 阶乘

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1

查看全部评分

回复 使用道具 举报
  1. public class Temp10_19
  2. {
  3.         public static void main (String[] args)
  4.         {
  5.                 System.out.println("用循环实现求 n! 的结果(n=4):"+f1(5));
  6.                 System.out.println("用递归实现求 n! 的结果(n=4):"+f2(5));
  7.         }
  8.         static long f1(int n)
  9.         {
  10.                 long k=1;
  11.                 for(int i=1;i<=n;i++)
  12.              k*=i;
  13.                 return k;
  14.         }
  15.         static long f2(int n)
  16.         {
  17.                 if(n==1)  return 1;
  18.                 else     return n*f2(n-1);//这句不明白,请给我详细讲解一下!谢谢
  19.         }
  20. }
  21. /*
  22. 这句话的意思是说将n-1作为参数传给f2.具体点说就是:
  23.         当调用f2(5)时,第一次n=5,运行到
  24.                                 if(n==1)  return 1;//判断不满足,继续执行
  25.                 else     return n*f2(n-1);//返回的是5*f(n-1)
  26.         n-1=4;注意此时是将4传给f2,也就是说这时n=4;
  27.         这里的n-1和n之间一定要区分开:
  28.         n是f2的形式参数,只是一个代号,这里的n-1是一个具体的值。
  29.         然后再调用函数f2执行上面两句话,此时返回的是5*4*f2(n-1)
  30.                        
  31. */
复制代码

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
根据递归的原理,你画一个简单的流程图就可以明白递归的原理了。
计算f2(5)来举例:
第一步:f2(5) = 5 * f2(4)
第二步:        = 5 * 4 * f2(3)
第三部:        = 5 * 4 * 3 * f2(2)
第四步:        = 5 * 4 * 3 * 2 * f2(1)
第五步:        = 5 * 4 * 3 * 2 * 1 //因为调用到f2(1)时,不需要再递归了,直接就返回了1
然后计算出结果就对了。

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1

查看全部评分

回复 使用道具 举报
FFF 金牌黑马 2013-10-19 13:38:08
报纸
很感谢各位,回答得真好!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马