一、定义

 

解释一:程序调用自身的编程技巧称为递归,它分为调用阶段和回退阶段,递归的回退顺序是它调用顺序的逆序。递归函数即自调用函数,在函数体内部直接或间接地自己调用自己,即函数的嵌套调用是函数本身。它使用的是选择结构:if/switch。而循环结构使用的是for,while,do while。

解释二:递归就是有去有回。基本思想是把规模大的问题转化为规模小的相似的子问题来解决。在函数实现时,因为解决大问题的方法和解决小问题的方法往往是同一个方法,所以就产生了函数调用它自身的情况。另外这个解决问题的函数必须有明显的结束条件,这样就不会产生无限递归的情况了。

  举个例子:

 递归:你打开面前这扇门,看到屋里面还有一扇门(这门可能跟前面打开的门一样大小(静),也可能门小了些(动)),你走过去,发现手中的钥匙还可以打开它,你推开门,发现里面还有一扇门,你继续打开,。。。, 若干次之后,你打开面前一扇门,发现只有一间屋子,没有门了。 你开始原路返回,每走回一间屋子,你数一次,走到入口的时候,你可以回答出你到底用这钥匙开了几扇门。

 循环:你打开面前这扇门,看到屋里面还有一扇门,(这门可能跟前面打开的门一样大小(静),也可能门小了些(动)),你走过去,发现手中的钥匙还可以打开它,你推开门,发现里面还有一扇门,(前面门如果一样,这门也是一样,第二扇门如果相比第一扇门变小了,这扇门也比第二扇门变小了(动静如一,要么没有变化,要么同样的变化)),你继续打开这扇门,。。。,一直这样走下去。 入口处的人始终等不到你回去告诉他答案。(以上转载于:https://www.zhihu.com/question/20507130/answer/15551917)

 

二、代码

1、一个整数,大于0,不用循环和本地变量,按照n,2n,4n,8n的顺序递增,当值大于5000时,把值按照指定顺序输出来。
例:n=1237
则输出为:
1237,
2474,
4948,
9896,
9896,
4948,
2474,
1237,

public class Recursion {
    public static void main(String[] args) {
        doubleNum(1237);
    }
   public static void doubleNum(int n)
    {
        System.out.println(n);
        if(n <= 5000)
        doubleNum(n*2);
        System.out.println(n);        
    }  
}

 

 2、第一个人10岁,第二个人比第一个人大两岁,一次递推,用递归方式计算出第8个人多大?

public class Recursion {
    public static void main(String[] args) {
        int age = doubleNum(8);
        System.out.println(age);
    }
   public static int doubleNum(int n)
    {
       if(n == 1){
            return 10;
       }else{
            return doubleNum(n-1) + 2;
       }
                
    }  
}

 

3、1.一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?

public class Exercise {
    // 主函数
    public static void main(String[] args) {
        for (int i = 1; i < 8; i++) {
            System.out.println("经过第"+ i +"个村庄时有" + duckNum(i) + "只鸭子,卖出了"+(duckNum(i)/2+1) + "只鸭子,还剩" + duckNum(i+1)+"只鸭子");
        }
    }
    
    // 递归体
    public static int duckNum(int i) {
        int sub = 2;
        if(i!=8) {
            sub = duckNum(i+1)*2+2;
            i--;
        }
        return sub;
    }    
}

 

4、小猴子第一天摘下若干桃子,当即吃掉一半,又多吃一个.第二天早上又将剩下的桃子吃一半,又多吃一个.以后每天早上吃前一天剩下的一半另一个.到第10天早上猴子想再吃时发现,只剩下一个桃子了.问第一天猴子共摘多少个桃子?

public class ProgramNo17_1
{
    public static void main(String[] args)
    {
        System.out.printf("第一天猴子共摘了%d个桃子!\n", peachNumber(0));
    }
    private static int peachNumber(int days)
    {
        int peachs = 0;
        if(10 == days)
            peachs = 1;
        else
            peachs = peachNumber(days+1)*2;
 
        return peachs;
    }
 
}
//反过来看比较好,第1天有1个 第二天有4个 第三天有10个 第n天有 fn = (f(n-1)+1)*2个

 

5、有雌雄一对兔子,假定过两个月便可繁殖雌雄各一的一对小兔子。问过n个月后共有多少对兔子?

 

 

 

 

posted on 2020-05-11 22:38  小潘同学  阅读(293)  评论(0)    收藏  举报
-->