递归的几个典型示例
一、递归选择排序
选择排序法是找到列表最小的数并和第一个数交换。然后在剩余的数里找到最小的数,再将它和剩余列表中的第一个数交换,这样的过程一直进行下去,知道列表中仅剩一个数为止。
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);
}
}
}