基本算法之递归算法

基本算法之递归算法

一.递归算法的基本思想

递归算法即在程序中不断反复调用自身来达到求解问题的方法。此处的重点是调用自身,这就要求待解决的问题能够分解为相同问题的一个子问题。这样通过多次调用,就可以完成求解。
递归调用是一个方法在其方法体内调用其自身方法的调用方式。这种方法也称为递归方法。在递归方法中,主调方法又是被调方法。执行递归方法将反复调用其自身。每调用一次就进入新的一层。在编写递归方法时,必须使用if语句强制方法在未执行递归调用前返回。如果不这样做,在调用方法后,它将永远不会返回。这是一个很容易犯的错误
方法的递归调用分两种情况:直接递归和间接递归。
直接递归:即在方法中调用方法本身。
间接递归:即间接的调用一个方法,如function_a调用function_b,function_b又调用function_a。
对递归的优缺点进行一下总结:
**优点:**程序代码更简洁清晰,可读性更好。有的算法用递归表示要比用循环表示简洁精炼,而且与人工智能有关的问题,更适合用递归的方法,如八皇后问题,汉诺塔问题等。有的算法用递归可以实现,而用循环不一定可以实现。
**缺点:**大部分递归例程没有明显地减少代码规模和节省内存空间。递归形式比非递归形式运行的速度要慢一些。这是因为附加的方法调用增加了时间的开销,例如需要执行一系列的压栈出栈等操作。但在许多情况下不是太明显,速度的差别不是很大。如果递归层次太深,还可能导致堆栈溢出。

二.典型实例

典型问题就是数学上求阶乘的问题
1.分析:
所谓阶乘,就是从1到指定数之间的所有的自然数相乘的结果,n的阶乘为:n!=n*(n-1) * (n-2) * … * 2 * 1
而对于(n-1)!,则有如下的表达式:
(n-1)!=(n-1) * (n-2) * … * 2 * 1
从上述两个表达式可以看到阶乘具有明显的递推性质,即符合如下递推公式:n!=n*(n-1)!
2.参考代码

import java.util.Scanner;

public class Factorial {
	public static long fact(int n) {     //求阶乘方法
		if(n<=1) {
			return 1;
		}else {
			return n*fact(n-1);        //递归
		}
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int i;
		System.out.println("输入一个求阶乘的整数:");
		Scanner input = new Scanner(System.in);
		i=input.nextInt();
		System.out.println(i+"的阶乘结果为:"+fact(i));   //方法调用
	}

}

3.结果展示
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章