黑马程序员技术交流社区

标题: 递归原理求解 [打印本页]

作者: FFF    时间: 2013-10-19 11:43
标题: 递归原理求解
本帖最后由 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. }
复制代码
后一句里的递归不太理解,请对递归理解比较深的同学给我注解注解。谢谢!
作者: 上篮高手    时间: 2013-10-19 12:20
我总结的递归三个条件是:
1.具有返回值,且返回类型跟参数类型相容.
2.具有结束条件.
3.自身调用.
我觉得递归就是,不断地自身调用自身,但是不能没完没了,那样就成了死循环了,就是必须有结束条件,让它跳出循环。(一般来说跳出循环的体就是直接return一个返回值)
你需要一个可以找到规律的循环条件,并且在循环体里要做的同一件事情,这时候可以用递归来实现,这是我的想法
本例中: 你的if(n==1)  return 1; 是结束条件,因为f 函数传入的参数一直在减小,所以达到n = 1时 递归就结束了,这时的运算结果就是n 的 阶乘
作者: 卜弦    时间: 2013-10-19 12:24
  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. */
复制代码

作者: 周学彬    时间: 2013-10-19 13:23
根据递归的原理,你画一个简单的流程图就可以明白递归的原理了。
计算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
然后计算出结果就对了。

作者: FFF    时间: 2013-10-19 13:38
很感谢各位,回答得真好!




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