java递归算法

由于面试被问到了递归问题,想想也是大学计算机基础知识,今天就来总结一下:

递归算法是指将重复的问题分解为同类的子问题来解决问题的方法。是一种“自调用”,可以完全取代循环。

实现步骤:

1 总结数学规律

2 代码实现

一 1+2+…+100 求和

1 f(1)=1,f(2)= f(1)+2,f(3)= f(2)+f(1) +3 ·······f(n)= f(n-1)+f(n-1)+···f(1)+n

2 实现方法

循环实现:

public class exercise {
	public static void main(String[] args){
		int sum = add(100);
		System.out.print("1~100的和为:"+sum);
		
	}

	private static int add(int n) {
		// TODO 求和函数
		int sum = 0;
		for(int i=1;i<=n;i++){
			sum +=i;	
		}
			
		return sum;
	}
}

递归实现:

public class exercise {
	public static void main(String[] args){
		int sum = add(100);
		System.out.print("1~100的和为:"+sum);
		
	}

	private static int add(int n) {
		// TODO 递归实现
		int sum = 0;
		//递归有判断
		if(n == 1){
			sum = 1; //递归的出口
		} else {
			sum = add(n-1)+n; //一般规律
		}
		return sum;
	}

注意:递归条件的判断、一般规律、出口三点即可

 

二 斐波那契数列求和

1 数列规律

第n项规律

《java递归算法》

数列和规律

《java递归算法》

2 代码实现

public static void main(String[] args){
		int n = 5;
		int sum = feibonaqisum(n);
		System.out.println("斐波那契第"+n+"项:"+sum);
		
	}

	private static int feibonaqisum(int n) {
		// TODO 斐波那契数列和
		if(n == 1){
			return 1;
		}else{
			System.out.print(feibonaqisum(n-1));
			System.out.println(num(n));
			return feibonaqisum(n-1)+ num(n);
		}
	}

	private static int num(int n) {
		// TODO 斐波那契第n项
		if(n<=2){
			return 1;
		} else {
			return num(n-1)+num(n-2);	
		}
		
	}

注意:问题的是第n项数值,还是求数列的n项和

三 汉诺塔

问题描述:

要求:输入一个正整数n,表示有n个盘片在第一根柱子上。输出操作序列,格式为“移动 t从 x 到 y”。每个操作一行,表示把x柱子上的编号为t的盘片挪到柱子y上。柱子编号为A,B,C,你要用最少的操作把所有的盘子从A柱子上转移到C柱子上。

数学归纳:

开始时,A柱上有n个盘子,B柱和C柱上没有盘,求解towers(n,A,B,C)。递归的解决方案陈述如下:

第一步:从初始状态开始,求解问题:towers(n-1,A,C,B),即忽略底部(最大)的盘子,并将最上面的n-1个盘子从A柱移到C柱上,使B柱备用,完成时,最大的盘子留在A柱上,所有其它盘子在C柱上。

第二步:现在,最大盘子在A柱上,所有其它盘子在C柱上,求解问题:towers(1,A,B,C),也就是将最大的盘子从A移到B上。因为这个盘子比已在C柱上的盘子大,所以不需要使用备用柱。这种基本事件不需要使用备用柱子。完成后,最大盘子在B柱上,而其他盘子仍在C柱上。

第三步:最后,当最大的盘子在B柱上而其他盘子在C柱上时,求解问题:towers(n-1,C,B,A),即,将n-1个盘子从C移动到B柱上,A柱备用。因为目的柱B上已经有一个最大的盘子,所以我们尅忽略它。完成后,就解决了原问题:所有的盘子都在B柱上。

代码实现:

public static void main(String[] args){
		int n = 2;
		hannuotawers(n,"A","B","C");
	}

	
	
	
	private static void hannuotawers(int n, String source, String spare,
			String destination) {
		// TODO 汉诺塔n个盘片
		if(n==1){
			System.out.println("from"+source+"to"+destination);
			
		}else{
			hannuotawers(n-1,source,destination,spare);
			hannuotawers(1,source,spare,destination);
			hannuotawers(n-1,spare,source,destination);
		}
		
	}

 

    原文作者:递归算法
    原文地址: https://blog.csdn.net/weixin_36381641/article/details/80787500
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞