递归算法(demo:斐波那契数列的实现,树的遍历,快速排序)

递归算法:执行代码,并没执行完全的时候调用自己本身,然后等待条件不满足递归的时候,完全执行代码,执行完全后返回上一层,执行未完成的部分;

递归算法与for,where循环可以相互转换,通过一定的方案达到一样的效果,比如for循环可以通过栈,实现递归的效果;

递归算法一般用于树的节点的遍历等...

递归算法的重点:参数的设置;

demo:斐波那契数列的实现

for循环方式实现:

//1,1,2,3,5,8,13,...
int num1=1;
int num2=1;
int num3=0;
int n=10;//表示斐波那契数列的第十项
for(int i=2;i<n;i++){
   num3=num1+num2;
   num2=num3;
   num1=num2;
}
//后一项等于前两项相加

递归实现方式:

main方法
{
   //调用
}

static int run(int n){

  if(n==1||n==2){

    return 1;

  }else{
    
    return run(n-1)+run(n-2);

  }

}

该demo中,递归时间消耗远大于循环;(递归性能低)

---------------------------------------------------------------------------------------------------------------------------------------------------------------

demo2:树的遍历(文件夹遍历)-----真实场景中:文件夹的剪切(Java不提供文件夹的剪切方法,需要自己代码实现)

main(){//主方法

   play(new File("D:\\ceshi"));

}

static void play(File file){

   //获取当前文件夹下的所有文件夹、文件
   File[] files=file.listFiles();

   for(int i=0;i<files.length;i++){
      
     if(files[i].isFile()){//是文件

        System.out.println(files[i].getName());        

     }else{//是文件夹

        play(files[i]);

     }

   }

}

类似于树状的结构,使用递归效率较高;

如上述demo中的文件夹的遍历,又比如,快速排序算法的实现:

demo3:快速排序的实现

package zmc.text;

public class paixu {

	public static void main(String[] args) {

		int arr[]={5,6,3,8,4,9,5,1,2,8};
		sortFinally(arr,0,arr.length-1);
	}
	
	public static void sortFinally(int[] arr,int lo,int hi){
		if(lo<hi){
			int middle=sort(arr,lo,hi);
			sortFinally(arr,lo,middle-1);//左边
			sortFinally(arr,middle+1,hi);//右边
		}

	}
	
	public static int sort(int[] arr,int lo,int hi){
		//找到一个标识:一般为数组的第一个值
		int key=arr[lo];
		//对一个数组进行循环遍历,i从左往右,j从右往左
		//j先走,与key进行比较,比key小则赋值给i(对应的值)
		//j赋值完就不动了,i开始走,遇到比key大的,停止,赋值给j对应的数字
		//...
		int i=lo;//开始位置
		int j=hi;//结束位置
		while(i<j){
			while(i<j){
				if(arr[j]<key){//j找小于key的值给i
					arr[i]=arr[j];
					break;
				}
				j--;
			}
			
			while(i<j){
				if(arr[i]>=key){//i找大于key的值给j
					arr[j]=arr[i];
					break;
				}
				i++;
			}
		}
		//当i,j相遇,key的值赋值给那个位置的数
		arr[i]=key;
		return i;
	}

}

猜你喜欢

转载自blog.csdn.net/qq_33999844/article/details/81740057