黑马程序员技术交流社区

标题: 递归就是函数自身调用自身。 什么时候用递归? [打印本页]

作者: zZZ~~    时间: 2013-4-18 23:25
标题: 递归就是函数自身调用自身。 什么时候用递归?
有人可以举一下例子么

作者: 王大斌    时间: 2013-4-19 01:06
当你发现某一类问题可以转化为更小的问题的时候,而最小的子问题具有对应的解,这个时候,使用递归是不错的,典型的是求一个数的2进制数算法,n!算法
菲波那契数列。
要想掌握递归,理解底层调用原理很重要,也就是函数的栈调用。。

看看数据结构的书
作者: 心弦上的景致    时间: 2013-4-19 08:23
一个方法内部再调用该方法.
是一个树状结构.
比如F盘有N个文件夹,
而这N个文件夹下面又有N个不等的文件夹...
有什么办法把F盘的所有的文件夹找出来呢?
你可以让程序 从第一个文件夹去找.
如果文件夹下面还有文件你就在从这个子文件夹的第一个文件夹找..如果文件夹下面还有文件...一直找到没有文件夹了.好了!
第一个找完了.
然后再找第一个文件夹下面的第一个文件夹下面的第一个文件夹..第2个文件夹...
就这样一直找下去.也就是用for
递归一般都是方法内部的for再去调本方法
我想这就是递归的作用吧.
                  F:
       Files                   Files     
        |                       |
  Files Files   Files        Files  Files
    |              |           |
    Files File    Files        Files
     |                          |
   Files                 Files    Files   
      |                           |
Files  Files Files             Files Files
如果你用一个办法把这些文件夹都找出来了.
并且不漏掉,你递归就会了.
作者: 李希鹏    时间: 2013-4-19 08:31
  1. package com.sort;

  2. /*计算sum(1)+sum(2)+……+sum(100)
  3. *
  4. */

  5. public class TestDemo {
  6. public static void main(String[] args) {
  7. System.out.println("计算结果:" + sum(1));// 调用操作

  8. }

  9. public static int sum(int num) {
  10. if (num == 100) {// 判断是否加到了最后一个数
  11. return 100;
  12. } else {
  13. return num + sum(num + 1); // 递归调用
  14. }

  15. }

  16. }

  17. /*
  18. * 递归调用必须有一个明确的约束条件,然后不断改变传入的数据
  19. */
复制代码
这样就清楚了呗,"有一个明确的约束条件,需要不断改变传入的数据" 的时候用递归调用

未命名.jpg (822.05 KB, 下载次数: 66)

未命名.jpg

作者: 〃Mr.Zぐ    时间: 2013-4-19 12:40
程序调用自身的编程技巧称为递归( recursion)。   一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。   注意:   (1) 递归就是在过程或函数里调用自身;   (2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。

上面是递归的定义,我现在给你一个JAVA最简单的递归的我写的例子,你可以对照着看:

public class Test
{         public static void main(String[] args) {                
        output(1);
        }
        private static void output(int n) {                
              System.out.println(n);                
            if(n<100)
           {                 n++;
                        output(n);                
           }        
    }
}
作者: zZZ~~    时间: 2013-4-20 01:10
王大斌 发表于 2013-4-19 01:06
当你发现某一类问题可以转化为更小的问题的时候,而最小的子问题具有对应的解,这个时候,使用递归是不错的 ...

谢谢:handshake
作者: zZZ~~    时间: 2013-4-20 01:17
谢谢楼上各位的解答 谢谢




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