1.递归的概念
一个方法在执行的过程中调用自身,就称为递归
递归相当于数学上的数学归纳法,有一个起始条件,就有一个递推公式。
例如,我们求N!
起始条件:N = 1的时候,N!为1,这个起始条件相当于递归的结束条件。
递推公式:求N!,直接不好求,可以吧问题转换成N! = > N * (N-1)!
例子1:
public class Recusion { public static void function(){ function(); } public static void main(String[] args) { function(); } }
会得出
Exception in thread "main" java.lang.StackOverflowError错误
这个是栈溢出错误,一般情况去检查递归的终止条件
(1)没有(2)给错了
public class Recusion { public static void function(int a){ if(a == 1){ System.out.println(a); return; } function(a-1); System.out.println(a); } public static void main(String[] args) { function(10); } }
输出1到10
观察:
(1)每次递归的时候,这个方法只执行了一部分,就去执行另一个部分了
(2)归的时候,会把当前方法剩余部分执行完毕
(3)递的次数和归的次数是一样的
例子2:阶乘使用递归执行
public static int fac(int n ){ if(n == 1){ return 1; } int tmp = n * fac(n - 1); return tmp; } public static void main(String[] args) { int ret = fac(9); System.out.println(ret); }
2.按顺序打印数字的每一位
public static void asd(int n){ if(n < 10){ System.out.println(n); return; } asd(n / 10); System.out.println(n % 10); } public static void main(String[] args) { asd(598); }
3.递归求1+2+3+ 。。 + 10
public static int sum(int num){ if(num == 1){ return 1; } return num + sum(num - 1); }
4.写一个递归方法,输入一个非负整数,返回组成他们的数字之和
public static int addition(int n){ if(n < 10){ return n; } int tmp = (n % 10) + addition(n / 10); return tmp;
5.写一个递归方法,求斐波那契数列的第n项
public class fib { public static int fib(int n){ if(n == 1 || n ==2){ return 1; } return fib(n-1) + fib(n - 2); } public static void main(String[] args) { System.out.println(fib(5)); } }
6.汉诺塔
import java.util.Scanner; public class HANIO { public static void hanio(int n, double num1, double num2, double num3){ if(n == 1){ move(num1, num3); return; } hanio(n-1,num1,num3,num2); move(num1,num3); hanio(n-1,num2,num1,num3); } public static void move(double num1, double num2){ System.out.print(num1 + "->" + num2+" "); } public static void main(String[] args) { Scanner scan = new Scanner(System.in); int n = scan.nextInt(); hanio(n,1,2,3); } }