递归算法:递归算法是把问题转化为规模缩小了的同类问题的子问题。然后递归调用函数(或过程)来表示问题的解。
递归算法是算法设计中比较常用的一种算法,它的优点在于考虑问题的角度不再局限于过程,而是从整体的角度去思考问题。常见的递归实例有:阶乘,斐波那契数列,汉诺塔等等。
下面我们分别用java语言来书写上述的三个例子:
阶乘:
importjava.io.*;
publicclass Factorial{
publicstatic void main(String[] args) throws IOException {
int n,m;
BufferedReader buf;
buf=new BufferedReader(new InputStreamReader(System.in));
System.out.print("请输入所求的阶乘数:");
n=Integer.parseInt(buf.readLine());
Factorial factorial=new Factorial();
m=factorial.multiply(n);
System.out.println(n+"的阶乘为: "+m);
}
publicint multiply(int n){
//跳出递归条件
if(n==1||n==0){
return1;
}
else{
//子问题分解
returnn*multiply(n-1);
}
}
}
斐波那契数列
importjava.io.*;
publicclass Fibonacci{
publicstatic void main(String[] args) throws IOException {
int n;
BufferedReader buf;
buf=new BufferedReader(new InputStreamReader(System.in));
System.out.print("请输入需要输出的Fibonacci的个数:");
n=Integer.parseInt(buf.readLine());
Fibonaccifibonacci=new Fibonacci();
while(n==0){
System.out.print("您所输入的Fibonacci的个数为0,请重新输入!");
n=Integer.parseInt(buf.readLine());
}
for(inti=1;i<=n;i++){
System.out.print(fibonacci.fib(i)+"");
}
}
publicint fib(int n){
//特殊情况
if(n==0){
return0;
}
else{
//跳出递归条件
if(n==1||n==2){
return1;
}
else{
//子问题分解
returnfib(n-1)+fib(n-2);
}
}
}
}
汉诺塔:
importjava.io.*;
publicclass Hanoi{
publicstatic void main(String args[]) throws IOException{
int n;
BufferedReader buf;
buf=new BufferedReader(new InputStreamReader(System.in));
System.out.print("请输入盘数");
n=Integer.parseInt(buf.readLine());
Hanoihanoi=new Hanoi();
hanoi.move(n,'A','B','C');
}
publicvoid move(int n,char a,char b,char c){
//跳出递归条件
if(n==1){
System.out.println("盘"+n+"由 "+a+" 移至"+c);
}
else{
//子问题分解
move(n-1,a,c,b);
System.out.println("盘"+n+"由 "+a+" 移至 "+c);
//子问题分解
move(n-1,b,a,c);
}
}
}
从上述代码中我们可以总结出,递归使用的一般规律:
1、问题可分解与原问题相似或相近的子问题。
例如:
n的阶乘可以看做是n乘以n-1的阶乘
斐波那契数列的第n个数是第n-1和n-2个数的和
如果要移动n个盘子的汉诺塔,可以看做是:先移动最上面n-1个汉诺塔和最下面盘子等等
总之,找出递归调用的分解是使用递归调用的关键一步
2、问题求解的时候有跳出或结束标志。
例如:
阶乘n的最后一步肯定是n=1
斐波那契数列的最后求和肯定是第一个数和第二个数
汉诺塔中盘子的个数为1的时候等等
注意:有时候在使用递归算法的时候会碰到一些特殊情况,这个时候读者可以根据需要特殊对待。
例如:斐波那契数列的定义规定F(0)=0,这个时候如果需要那么我们就不能用一般的递归来分解这时就需要特殊对待了。
分享到:
相关推荐
递归算法详解递归算法详解递归算法详解递归算法详解
递归算法详解 数据结构中一些常用的算法,重点讲述递归算法的实现!!
递归算法详解,更详细的理解,欢迎下载哦,谢谢啦,
ACM培训基础算法之递归PPT详解 包括递归的一些基础思想和一些经典例题
递归是编程中经常用到的算法思想,这篇讲义详细的解释了递归的相关用法,参考意义比较强。
各种常见递归算法的详细分析解释。汉诺塔,走迷宫,有向图,n皇后问题。
递归算法详解[归纳].pdf
2、递归算法通用解决思路 3、实战演练(从初级到高阶) 4、递归函数调用栈 5、递归算法时间复杂度分析与求解 力争让大家对递归的认知能上一个新台阶,特别会对递归的精华:时间复杂度作详细剖析,会给大家总结...
讲解快排的实现方法,原来自己摸索了很久,书上的代码一知半解,好像只能用递归的方法。。。
主要介绍了C++递归算法实例代码,还是比较不错的,运用了递归算法解决相关问题,这里分享给大家,需要的朋友可以参考下。
对经典算法八皇后问题的说明,以及代码示例,代码中有详尽的注释,有助于读者充分理解其递归调用的逻辑!
阶乘的算法可以定义成函数 当 n>0时,用 f(n-1)来定义 f(n),用 f(n-1-1)来定义 f(n-1)……,这是对递归形式的描述。 当 n=0时, f(n)=1,这是递归结束的条件。
计算二叉树深度算法(递归、非递归)入门详解
计算二叉树深度算法(递归、非递归)入门详解 C语言实现
有三根柱子A,B,C,A柱子上有N个盘子,从小到大依次叠放,要求把A上的盘子都移到C上,B可以作为临时存放,移动的时候必须始终遵循小盘子在大盘子上面,且每次只能移动一个盘子。
Java递归算法是基于Java语言实现的递归算法。递归算法对解决一大类问题很有效,它可以使算法简洁和易于理解。接下来通过本文给大家介绍Java递归算法相关知识,感兴趣的朋友一起学习吧
然后,我们可以使用递归函数backTrace来实现回溯算法。在backTrace函数中,我们可以判断当前皇后是否可以放置在当前位置,如果可以,则继续下一个皇后;否则,则回溯到上一个皇后,重新安排其位置。 通过回溯算法,...
冒泡算法(递归实现) */ function maoPao($array, $index=0) { $count = count($array); if(($count-1) <= $index) return $array; for($i=$count-1; $i>$index; $i– ) { if($array[$i] < $...