数据结构与算法(Java描述)-16、递归算法及其应用

来源:互联网 发布:飞豆打印软件 编辑:程序博客网 时间:2024/05/16 08:18

一、递归的概念

若一个算法直接地或间接地调用自己本身,则称这个算法是递归算法。
问题的定义是递归的
  例如:阶乘函数的定义
                 1               当n=1时  
     n! =     
              n*(n-1)!        当n>1时

递归算法的设计方法:

适宜于用递归算法求解的问题的充分必要条件是:   (1)问题具有某种可借用的类同自身的子问题描述的性质 
 (2)某一有限步的子问题(也称作本原问题)有直接的解存在。
当一个问题存在上述两个基本要素时,设计该问题的递归算法的方法是:
(1)把对原问题的求解表示成对子问题求解的形式。
(2)设计递归出口。

二、递归的应用

1、求n!

import java.util.Scanner;//求n!public class factorial {public static int factorial(int num) {if(num==1)return 1;elsereturn 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);}}}
2、递归实现折半查找

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);elsereturn 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("没有找到该数字!");}}}}
3、求斐波那契数列前N项之和。

从第三项起,每项是前两项之和。  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)最后被调用的函数要最先被返回。
系统用于保存递归函数调用信息的堆栈称作运行时栈。
每一层递归调用所需保存的信息构成运行时栈的一个工作记录  
栈顶的工作记录保存的是当前调用函数的信息,所以栈顶的工作记录也称为活动记录。


阅读全文
0 0
原创粉丝点击