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

本文介绍了递归算法的基本概念,包括递归的定义及其设计方法,并通过实例演示了递归算法在求解阶乘、折半查找、斐波那契数列求和及最大公约数等问题中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、递归的概念

若一个算法直接地或间接地调用自己本身,则称这个算法是递归算法。
问题的定义是递归的
  例如:阶乘函数的定义
                 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;
		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);
		}
	}

}
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);
		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("没有找到该数字!");
			}
		}
		
	}
}
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)最后被调用的函数要最先被返回。
系统用于保存递归函数调用信息的堆栈称作运行时栈。
每一层递归调用所需保存的信息构成运行时栈的一个工作记录  
栈顶的工作记录保存的是当前调用函数的信息,所以栈顶的工作记录也称为活动记录。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值