数据结构与算法(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
- 数据结构与算法(Java描述)-16、递归算法及其应用
- 数据结构与算法(Java描述)-7、链式堆栈及其栈的应用
- 数据结构与算法(Java描述)-17、递归转化成非递归算法以及迷宫算法
- 栈及其应用 - C语言实现(摘自数据结构与算法分析 C语言描述)
- 栈及其应用 - C语言实现(摘自数据结构与算法分析 C语言描述)
- 数据结构与算法C++描述(7)---堆栈及其在“火车车厢重排问题”中的应用
- 数据结构与算法分析(Java语言描述)(15)—— 二分查找(递归与非递归)
- 《数据结构、算法与应用》C++语言描述
- 数据结构-绪论-算法及其描述
- 递归算法及其应用
- 递归算法及其应用
- 数据结构、算法与应用 (C++描述) 第二版 1.1
- 数据结构、算法与应用(C++描述)第二版 1.3
- 数据结构、算法与应用 (C++描述) 第二版 1.2
- 数据结构、算法与应用 (C++描述) 第二版 1.4
- 数据结构、算法与应用 (C++描述) 第二版 1.5
- 数据结构、算法与应用 (C++描述) 第二版 1.6
- 数据结构、算法与应用(C++描述) 第二版 1.7
- 1011. A+B和C (15)
- TransactionTooLargeException异常分析
- git的使用之eclipse Hbuilder
- 字符,字节和编码
- Sublime Text3下配置SublimeLinter进行PHP代码检查(windows)
- 数据结构与算法(Java描述)-16、递归算法及其应用
- Caffe学习系列:用训练好的caffemodel来进行分类
- Java中的密码优先使用 char[] 而不是String
- 软键盘挡住EditText
- 2-1 Point类的定义
- 一个Windows C++的线程池类实现
- Hibernate主键生成策略
- JSON数据解析(三)——FastJson
- 基于android的微信机器人