一、递归的概念
若一个算法直接地或间接地调用自己本身,则称这个算法是递归算法。
问题的定义是递归的
例如:阶乘函数的定义
1 当n=1时
n! =
n*(n-1)! 当n>1时
递归算法的设计方法:
适宜于用递归算法求解的问题的充分必要条件是: (1)问题具有某种可借用的类同自身的子问题描述的性质
(2)某一有限步的子问题(也称作本原问题)有直接的解存在。
当一个问题存在上述两个基本要素时,设计该问题的递归算法的方法是:
(1)把对原问题的求解表示成对子问题求解的形式。
(2)设计递归出口。
二、递归的应用
1、求n!
2、递归实现折半查找import java.util.Scanner; //求n! public class factorial { public static int factorial(int num) { if(num==1) return 1; else return num*factorial(num-1); } public static void main(String[] args) { Scanner sc=new Scanner(System.in); System.out.println("请输入一个整数(1-100之间):"); while(sc.hasNext()) { int num=sc.nextInt(); int result=factorial(num); System.out.println(num+"的阶乘是:"+result); } } }
3、求斐波那契数列前N项之和。import java.util.Scanner; //递归二分法查找 public class BinarySearchRecursion { public static boolean binarySearch(int array[],int key,int low,int high) { int middle; if(low>high) { return false; } middle=(low+high)/2; if(array[middle]==key) return true; else if(array[middle]>key) return binarySearch(array, key, low, middle-1); else return binarySearch(array, key, middle+1, high); } public static void main(String[] args) { int array[]= {1,2,4,6,15,45,77,98}; Scanner sc=new Scanner(System.in); System.out.println("请输入你要查找的数字:"); while(sc.hasNext()) { int key=sc.nextInt(); if(binarySearch(array, key, 0, array.length-1)) { System.out.println(key+"找到了!"); }else { System.out.println("没有找到该数字!"); } } } }
从第三项起,每项是前两项之和。 1、1、2、3、5、8、13.....
import java.util.Scanner; //求前n项斐波那契数列的和 public class Fibonacci { public static int fibonacci(int n) { if(n==0||n==1) return 1; else return fibonacci(n-1)+fibonacci(n-2); } public static void main(String[] args) { //1 1 2 3 5 Scanner sc=new Scanner(System.in); int result=0; System.out.println("请输入一个整数:"); while(sc.hasNext()) { int n=sc.nextInt(); for (int i = 0; i < n; i++) { result+=fibonacci(i); } System.out.println("斐波那契数列前"+n+"项和为:"+result); } } }
4、求两个整数的最大公约数
//求两个整数的最大公约数 public class GcbNumber { public static int gcb(int bigNumber,int smallNumber) { if(bigNumber<0||smallNumber<0) return -1; if(smallNumber==0) return bigNumber; if(bigNumber<smallNumber) { return gcb(smallNumber,bigNumber); }else { return gcb(smallNumber,bigNumber%smallNumber); } } public static void main(String[] args) { Scanner scanner=new Scanner(System.in); System.out.println("请输入两个整数:"); while(scanner.hasNext()) { int bigNumber=scanner.nextInt(); int smallNumber=scanner.nextInt(); int result=gcb(bigNumber, smallNumber); System.out.println(bigNumber+"和"+smallNumber+"的最大公约数为:"+result); } } }
三、递归过程和运行时栈
递归函数的执行过程具有三个特点:
(1)函数名相同;
(2)不断地自调用;
(3)最后被调用的函数要最先被返回。
系统用于保存递归函数调用信息的堆栈称作运行时栈。
每一层递归调用所需保存的信息构成运行时栈的一个工作记录
栈顶的工作记录保存的是当前调用函数的信息,所以栈顶的工作记录也称为活动记录。