阶乘(引入)
举一个简单阶乘案例
n! = n (n-1)(n-2)…21
n! = n * (n-1)!
(n-1)! = (n-1 )(n-2)!
…
2! = 2 * 1!= 2
1! = 1
计算阶乘能够特别好的体现递归的思想
- 1,把一个复杂的大问题,分解成若干个相似的子问题
-
- 2,子问题还能够继续分解
-
- 3,最终子问题分解的特别小,小到随便就能知道答案
-
- 4,最后,把所有子问题的解合并起来,就是复杂大问题的解
怎么写一个递归
写递归,别的先不想,先想什么时候停下来,先想递归出口
然后再写递归出口
优缺点
递归的优点:能够把大问题分解成小问题,非常利于思考,往往代码也不复杂
但是递归很危险,占用空间,效率也低
正常情况不要使用
java代码实现
//使用递归求解阶乘
public static int factorial(int n) {
if (n == 1) {
return 1;
} else {
return n * factorial(n - 1);
}
}
汉诺塔问题(经典)
规则
简单来说:有三个塔1,2,3,塔1上有 N 个(N>1)穿孔圆盘,大盘在下,小盘在上
要求按下列规则将所有圆盘移至塔3:
- 1,每次只能移动一个圆盘
- 2,大盘一定在小盘之下
思路
实际上无论n等于几,都可以总结出一个规律
第一部分:把除了最大的盘子之外的所有盘子,都移到辅助的塔2中
第二部分:把大盘从塔1移到塔3
第三部分:再通过塔1去辅助,把塔2中除了最大盘子之外的所有盘子,移到塔3
实现
斐波那契数列
规则
输入一个数据n,计算斐波那契数列(Fibonacci)的第n个值
1 1 2 3 5 8 13 21 34 55
规律:一个数等于前两个数之和
要求:计算斐波那契数列(Fibonacci)的第n个值,并将整个数列打印出来