递归方法简介:
一个方法体内调用它自身,每次调用时传入不同的变量,递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。
- 方法递归包含了一个隐式循环,它会重复执行某段代码,但是这种执行无需循环控制。
- 递归一定要向已知方向递归,否则这种递归就变成了无穷递归,类似于死循环。
- 执行一个方法时,就创建一个新的受保护的独立空间(栈空间)
- 方法的局部变量是独立的,不会相互影响, 比如n变量
- 如果方法中使用的是引用类型变量(比如数组),就会共享该引用类型的数据.
- 递归必须向退出递归的条件逼近,否则就是无限递归,出现StackOverflowError,死龟了
- 当一个方法执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕。
1.用递归求一个1-100的和
package demo; public class demo1 { public static void main(String[] args) { int n=100; demo1 demo1 = new demo1(); int sum = demo1.getSum(n); System.out.println("1-100的和为:"+sum); } //递归求和 private int getSum(int n){ //当n==3时 if (n==1){ return 1; }else { return n+getSum(n-1); //当n=3时,返回结果为3,n=2时,返回结果为2。n=1时,返回结果为1 } } }
输出结果
Task :demo1.main()
1-100的和为:5050
2.10的阶乘10!懂得其中的逻辑就行,不用太去深究
package demo; public class demo2 { public static void main(String[] args) { int n=10; demo2 demo2 = new demo2(); int aa = demo2.factorial(n); System.out.println("10的阶乘为:"+aa); } public int factorial(int n){ if (n==1){ return 1; }else { return n * factorial(n-1); } } }
输出结果
Task :demo2.main()
100的阶乘为�?3628800
阶乘具体图解如下:
打印问题:
public class RecursionTest { public static void main(String[] args) { test(4); } public static void test(int n) { if (n > 2) { test(n - 1); } System.out.println("n=" + n); } }
输出结果如下:
n=2 n=3 n=4
具体图解如下:
递归的练习一
代码如下:
public class RecursionExercise01 { public static void main(String[] args) { T t = new T(); int n = 7; int res = t.fibonacci(n); if (res != -1) { System.out.println("当n=" + n + " 对应的斐波那契数= " + res); } } } class T { public int fibonacci(int n) { if (n >= 1) { if (n == 1 || n == 2) { return 1; } else { return fibonacci(n - 1) + fibonacci(n - 2); } } else { System.out.println("要求输入的n>=1 的整数"); return -1; } } }
输出结果如下:
当n=7 对应的斐波那契数= 13
具体分析图解如下:
递归练习二
具体代码如下:
public class Recursion02 { public static void main(String[] args) { //思路分析: //1.day=10 有一个桃子 //2.day=9 有(day10+1)*2 //3.day=8 有(day9+1)*2 个桃子 //4.day=7 有(day8+1)*2 个桃子 //规律:前一天的桃子=(后一天的桃子+1)*2 A a = new A(); int peachNum = a.peach(8); if (peachNum != -1) { System.out.println(peachNum); } } } class A { public int peach(int day) { if (day == 10) { return 1; } else if (day >= 1 && day <= 9) { return (peach(day + 1) + 1) * 2; } else { System.out.println("day在1-10"); return -1; } } }
输出结果如下:
10