一、定义

解释一:程序调用自身的编程技巧称为递归,它分为调用阶段和回退阶段,递归的回退顺序是它调用顺序的逆序。递归函数即自调用函数,在函数体内部直接或间接地自己调用自己,即函数的嵌套调用是函数本身。它使用的是选择结构: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个月后共有多少对兔子?
浙公网安备 33010602011771号