递归的典型示例

递归的几个典型示例

一、递归选择排序

选择排序法是找到列表最小的数并和第一个数交换。然后在剩余的数里找到最小的数,再将它和剩余列表中的第一个数交换,这样的过程一直进行下去,知道列表中仅剩一个数为止。
    1.找出列表中最小数,然后将它与第一个数交换
    2.忽略第一个数,对余下的较小一些的列表进行递归排序。
package RecursiveSelectionSort;
import java.util.Scanner;
public class RecursiveSelectionSort {
 
	 public static void main(String[]args)
	 {

			Scanner input=new Scanner(System.in);
			   int n=input.nextInt();
			
		   int [] a=new int[n];
		   for(int i=0;i<n;i++)
			   a[i]=input.nextInt();
		   SelectionSort(a,0);
		   for(int i=0;i<n;i++)
		   System.out.print(a[i]+"  ");
	   
	 }
	 public static void SelectionSort(int [] a,int start)
	 {
		if(start<a.length)
		 {
			int exchange=0;
			for(int i=start+1;i<a.length;i++)
			    if (a[i]<a[start])
				  {
			    	exchange=a[i];
			        a[i]=a[start];
			        a[start]=exchange;
			  }
			SelectionSort(a,start+1);
		  }
			
	 }
}

	





二、递归二分查找

二分查找法是另一种常见的对数值列表的查找方法。使用二分查找法的前提条件是数组中更的元素必须已经排好序。假设数组已按升序排列。二分查找法首先将关键字与数组的中间元素进行比较。考虑下面三种情况:
     1.如果关键字小于中间元素,只需要在数组的前一半元素中继续查找关键字
     2.如果关键字和中间元素相等,则匹配成功,查找结束
     3.如果关键字大于中间元素,只需要在数组后一半元素中继续查找关键字
package RecursiveBinarySearchMethod;
import java.util.Scanner;
public class BinarySearchMethod {
    public static void main(String[] args)
    {
    	Scanner input=new Scanner(System.in);
    	int number=input.nextInt();
    	System.out.println();
    	int n=input.nextInt();
    	int [ ] a=new int[n];
    	for(int i=0;i<n i="" a="" i="" input="" nextint="" system="" out="" println="" int="" findnumber="BinarySearch(a,number,0,a.length);" if="" number="" a="" findnumber="" system="" out="" println="" else="" system="" out="" println="" findnumber="" 1="" 1="" public="" static="" int="" binarysearch="" int="" a="" int="" number="" int="" left="" int="" right="" int="" center="(int)((left+right)/2);" if="" a="" center="">number)
    		{
    		BinarySearch(a,number,left,center);
    		}
    	else if(a[center]<number)
    		{
    		BinarySearch(a,number,center,right);
    		}
    	
    		return center;
    	
    }
}


三、得到目录的大小(书上说这道题不用递归很难解决诶~)

一个目录的大小是指该目录下所有文件大小之和。

目录的大小可以如下递归定义:
       size(d)=size(f1)+size(f2)+...size(fm)+size(d1)+size(d2)+...+size(fn)
java文件不会。
等啥时候会了再回来写

四、汉诺塔

这个问题是将制定个数而大小互不相同的盘子从一个塔移动到另一个塔上,移动要遵从下面的规则:
        1.n个盘子标记为1,2,3,...,n,而三个塔标记为A、B、C
        2.任何时候盘子都不能放在比它小的盘子的上方
        3.初始状态时,所有的盘子都放在塔A上
        4.每次只能移动一个盘子,并且这个盘子必须在塔顶位置
问题的基础情况是n=1。若n==1,就可以简单地把盘子从A移动到B。当n>1时,可以将原始问题拆成下面三个自问题,然后依次解决:
     (1)借助塔B将前n-1个盘子从A移动到C
     (2)将盘子n从A移动到B
     (3)借助塔A将n-1个盘子从C移动到B
下面的方法借助于辅助塔auxTower将n个盘子从原始塔fromTower移动到目标塔toTower上:
      void moveDisk(int n, char fromTower, char toTower, char auxTower)
       if(n==1)
        Move disk 1 from fromTower to the toTower;
        else
       {
         moveDisk(n-1, fromTower, auxTower, toTower);
         Move disk n from the formTower to the toTower;
         moveDisk(n-1,auxTower,fromTower);
        }


package TowerOfHanoi;
import java.util.Scanner;
public class TowerOfHanoi {
    public static void main(String[] args)
    {
    	Scanner  input=new Scanner(System.in);
    	System.out.println("Enter number of disks");
    	int n=input.nextInt();
    	System.out.println("The moves are:");
    	 moveDisks(n,'A','B','C');
    }
    public static void  moveDisks(int n,char fromTower,char toTower,char auxTower)
    {
    	if(n==1)
    		 System.out.println("Move disk "+n+" from "+fromTower+" to " +toTower);
    	else
    	{
    		moveDisks(n-1,fromTower,auxTower,toTower);
    		System.out.println("Move disk "+n +" from "+fromTower+" to "+toTower);
    		moveDisks(n-1,auxTower,toTower,fromTower);
    	}
    }
}


总之要明白一个道理:递归是整个方法的循环然后再对每个方法的步骤逐层调用,不能用传统的读程序思路来思考哈o(^▽^)o,上图就可以很明白地看出来啦



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值