数据结构与算法之递归

什么是递归
程序调用自身的方法叫做递归
一般来讲,递归需要有边界条件,递归前进段和递归返回段.
当条件不满足时,递归前进,当递归条件满足时,递归返回.

  • 递归的表现:函数调用函数自己
  • 递归的用处:将大型复杂问题化解为若干小问题求解
  • 递归的好处:代码量少
  • 递归的弊端:占用空间,函数基于栈内存运行

分治算法举例
文件夹遍历
在这里插入图片描述
二分查找
有序数组种查找指定元素
在这里插入图片描述
求和1+2+3+…+(n-1)+n

package 第六章递归;
//求和
public class Demo {
public static void main(String[] args) {
	System.out.println(f(100));
}
private static int f(int n) {
	if(n==1) {
		return 1;
	}else {
		return  f(n-1)+n ;
	}
}
}

求n的阶乘

package 第六章递归;
//阶乘
public class Demo {
public static void main(String[] args) {
	System.out.println(f(100));
}

private static int f(int n) {
	if(n==1||n==0) {
		return 1;
	}else {
		return  f(n-1)*n ;
	}
	
}
}

斐波那契数列前20项:
1,1,2,3,5,8,13,21…

package 第六章递归;

public class Demo2 {
public static void main(String[] args) {
	System.out.println(f(6));
}

private static int f(int n ) {
     if(n==1||n==2) {
    	 return 1;
     }
     return f(n-1)+f(n-2);
      
}
}

升级版

package 第六章递归;

public class Demo3 {
	//3.斐波那契数列
    public static void main(String[] args) {
		//迭代方式
    	int n =1;
    	int m = 1;
    	int out=0;
    	for(int i =0;i<=50;i++) {
    		if(i==1||i==2) {
    			System.out.println(1+",");
    		}else {
    			out=n+m;
    			System.out.println(out+",");
    			n=m;
    			m=out;
    		}
    	}
    	//递归方式
    /*	for(int i =1;i<=50;i++) {
    		System.out.println(f(i));
    	}*/
	}
    public static int f(int n) {
    	if(n==1||n==2) {
    		return 1;
    	}
    	return f(n-1)+f(n-2);
    }
}

汉诺塔问题
在这里插入图片描述

package 第六章递归;

public class Demo4 {
//汉诺塔问题
	/*
	前3个 x->z
		前2个 x->y
			前1个 x->z
			第2个 x->y
			前1个 z->y
		第3个 x->z
		前2个 y->z
			前1个 y->x
			第2个 y->z
			前1个 x->z
	========================
	前64个 x->z 借助y
		前63个 x->y 借助z
			前62个 x->z 借助y
				....
			第63个 x->y 
			前62个 z->y 借助x
				...
		第64个 x->z
		前63个 y->z 借助x
			...
			...
			...
	*/
	public static void main(String[] args) {
		move(64,"x","y","z");
	}
	private static void move(int i,String from,String mid,String to ) {
		if(i==1) {
			System.out.println(from+"->"+to);
		}else {
			move(i-1,from,to,mid);
			System.out.println(from+"->"+to);
			move(i-1,mid,from,to);
		}
	}
}

八皇后问题
在这里插入图片描述
在这里插入图片描述

package 第六章递归;

public class Demo6 {
	//八皇后-N皇后问题
	public static int count =0;
     public static void main(String[] args) {
		int[][] board = new int[8][8];
		eightQueue(0,board);
	}

	private static void eightQueue(int row, int[][] board) {
	      if(row>=8) {
	    	  count++;
	    	  System.out.println("第"+count+"种情况");
	    	  for(int i=0;i<board.length;i++) {
	    		  for(int j=0;j<board[i].length;j++) {
	    			  System.out.print(board[i][j]+" ");
	    		  }
	    		  System.out.println();
	    	  }
	      }else {
	    	  //先复制一份棋盘
	    	  int[][] newBoard = new int[8][8];
	          for(int i =0;i<board.length;i++) {
	        	  for(int j=0;j<board[i].length;j++) {
	        		  newBoard[i][j]=board[i][j];
	        	  }
	          }
	        //在新棋盘上选棋
	    	  for(int col=0;col<8;col++) {
	    		  if(noDangerous(row,col,newBoard)) {
	    			  //放皇后前先清空当前行
	    			  for(int c=0;c<8;c++) {
	    				  newBoard[row][c]=0;
	    			  }
	    			  newBoard[row][col]=1; 
	    			 eightQueue(row+1,newBoard);

	      }
	    	  
	      }
		
	}
}

	private static boolean noDangerous(int row, int col, int[][] newBoard) {
		//正上
		for(int r = row-1;r>=0;r--) {
			if(newBoard[r][col]==1) {
				return false;
			}
				
		}
		//左上
		for(int r= row-1,c=col-1;r>=0&&c>=0;r--,c--) {
			if(newBoard[r][c]==1) {
				return false;
			}
				
		}
		//右上
		for(int r = row-1,c=col+1;r>=0&&c<8;r--,c++) {
			if(newBoard[r][c]==1) {
				return false;
			}
		}
		return true;
	}
}

数独问题
在这里插入图片描述

package 第六章递归;

import java.util.Scanner;

public class Demo07 {
	public static int[][] board= new int[9][9];
	public static void main(String[] args) {
		//1.读取一个数独
		Scanner scanner = new Scanner(System.in);
		for(int i =0;i<9;i++) {
			String line =scanner.nextLine();
			for(int j=0;i<9;j++) {
				board[i][j]=Integer.parseInt(line.charAt(j)+"");
			}
		}
		//2.开始求解数独
		solve(0,0);
	}

	public static void solve(int row,int col) {
		if(row>=9) {
			print();
			System.exit(0);//程序立即结束
			
		}else {
			if(board[row][col]==0) {
				for(int n =1;n<=9;n++) {
					if(!isExist(row,col,n)) {
						board[row][col]=n;
						solve(row+(col+1)/9,(col+1)%9);
					}
					board[row][col]=0;
				}	
			}else {
				solve(row+(col+1)/9,(col+1)%9);
			}
		}


	}
	private static boolean isExist(int row,int col,int n) {
		//先看行
		for(int c=0;c<9;c++) {
			if(board[row][c]==n) {
				return true;
			}
		}
		//再看列
		for(int r =0;r<9;r++) {
			if(board[r][col]==n) {
				return true;
				
			}
		}
		//后看小九宫
		int rowMin=0;
		int rowMax = 0;
		int colMin=0;
		int colMax=0;
		//左上角 rowMin,colMin
		//右下角rowMax,colMax
		if(row>=0&&row<=2) {
			rowMin=0;
			rowMax=2;
		}
		if(row>=3&&row<=5) {
			rowMin=3;
			rowMax=5;
		}
		if(row>=6&&row<=8) {
			rowMin=6;
			rowMax=8;
		}
		if(col>=0&&col<=2) {
			colMin=0;
			colMax=2;
		}
		if(col>=3&&col<=5) {
			colMin=3;
			colMax=5;
		}
		if(col>=6&&col<=8) {
			colMin=6;
			colMax=8;
		}
		for(int r= rowMin;r<rowMax;r++) {
			for(int c=colMin;c<colMax;c++) {
				if(board[r][c]==n) {
					return true;
				}
			}
		}
		return false;
		
	}
	private static void print() {
		for(int i =0;i<9;i++) {
			for(int j=0;i<9;j++) {
				System.out.println(board[i][j]+" ");
			}
			System.out.println();
		}
	}

}

喜欢我的可以关注我,我们可以一起交流学习

微信公众号:

让我爱上它Computer

qq群:473989408

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值