java 递归

递归

递归是一种争对使用简单的循环难以编程实现的问题,提供优雅解决方案的技术。

  使用递归就是使用递归方法(recursive method)编程,递归方法就是直接或者间接调用自身的方法。递归是一个很有用的程序设计技术。在某些情况下,对于用其它方法很难解决的问题,使用递归就可以给出一个直观、直接的简单解法。例如需要遍历某个路径下的所有文件,但这个路径下文件夹的深度是未知的,那么就可以使用递归来实现这个需求。再如编写程序显示H树。

  示例:计算阶乘

  数字n的阶乘可以定义如下:

  0! = 1;

  n! = n * (n - 1)!;

  对给定的n如何求n!呢?由于已经知道0!=1,而1!=1 * 0!,因此很容易求得1!。假设已经知道(n-1)!,使用n! = n * (n - 1)!就可以得到n!。这样,计算n!的问题就简化为计算(n - 1)!.当计算(n -1)!时,可以递归地应用这个思路直到n递减为0.

  假定计算n!的方法是factorial(n)。如果用n=0调用这个方法,立即就能返回它的结果。这个方法知道如何处理最简单的情况,这种最简单的情况称为基础情况(base case)或终止条件(stopping condition)。如果用n>0调用这个方法,就把这个问题简化为n-1的阶乘的子问题。子问题在实质上和原始问题是一样的,但它比原始问题更简单也更小。因为子问题和原始问题具有相同的性质,所以可以用不同的参数调用这个方法,这称着递归调用(recursive call)。

计算factorial(n)的递归算法可以简单地描述如下:

if(n == 0)   
    return 1; 
else   
return n * factorial(n - 1);

一个递归调用可以导致更多的递归调用,因为这个方法继续把每个子问题分解成新的子问题。要终止一个递归方法,问题最后必须达到一个终止条件。当问题达到这个终止条件时,就将结果返回给调用者。然后调用者进行计算并将结果返回给它的自己的调用者。这个过程持续进行,直到结果传给原始的调用者为止。现在,原始问题就可以将factorial(n - 1)的结果乘以n得到。

public class ComputeFactorial{
     public static long factorial(int num) {
//num! = num * (num - 1)!  0! = 1
        if(num == 0)return 1;
    else return num * factorial(num - 1);  
    } 
}

注意:使用循环来实现factorial方法是比较简单且更加高效的。这里只是使用递归factorial方法演示递归的概念。比如我们前面所说的罗列出一个文件夹下的所有文件如果不使用递归很难解决。

  如果递归不能使问题简化并最终收敛到基础情况,就有可能出现无限递归。例如假设将factorial方法错误的写成 public static long factorial(int i){return n * factorial(n - 1);}

举例:递归选择排序


import java.util.Arrays;

public class RecursiveSelectionSort {
	//辅助方法
	public static void recursiveselectionsort (int [] array, int low, int high) {
		 if(low < high) {
	            int minindex = low;
	            int min = array[low];
	            for(int i = low + 1; i <= high; i++) {
	                if(array[i] < min) {
	                    minindex = i;
	                    min = array[i];
	                }
	            }
	            array[minindex] = array[low];
	            array[low] = min;
	            recursiveselectionsort(array,low + 1,high);
	        }
	}
	
	
	public static void sort(int[] array) {
		recursiveselectionsort(array,0,array.length - 1);
    }
	
	
	public static void main(String[] args) {
		
		//随机创建一个数组
		int[] array = new int[10];
        for(int i = 0; i < 10; i++)
        	array[i] = (int)(Math.random() * 100);
        
        //进行打印输出
        System.out.println("排序前:" + Arrays.toString(array));
        sort(array);
        System.out.println("排序后:" + Arrays.toString(array));
    }
}

输出结果:


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值