递归算法:递归算法是把问题转化为规模缩小了的同类问题的子问题。然后递归调用函数(或过程)来表示问题的解。

递归算法是算法设计中比较常用的一种算法,它的优点在于考虑问题的角度不再局限于过程,而是从整体的角度去思考问题。常见的递归实例有:阶乘,斐波那契数列,汉诺塔等等。

下面我们分别用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,这个时候如果需要那么我们就不能用一般的递归来分解这时就需要特殊对待了。

转载于:https://www.cnblogs.com/zs234/archive/2012/04/03/3233381.html

经典算法详解 之 递归算法相关推荐

  1. 经典算法详解--CART分类决策树、回归树和模型树

    Classification And Regression Tree(CART)是一种很重要的机器学习算法,既可以用于创建分类树(Classification Tree),也可以用于创建回归树(Reg ...

  2. 机器学习经典算法详解及Python实现--元算法、AdaBoost

    http://blog.csdn.net/suipingsp/article/details/41822313 第一节,元算法略述 遇到罕见病例时,医院会组织专家团进行临床会诊共同分析病例以判定结果. ...

  3. 机器学习10大经典算法详解

    "数据+算法=模型". 面对具体的问题,选择切合问题的模型进行求解十分重要.有经验的数据科学家根据日常算法的积累,往往能在最短时间内选择更适合该问题的算法,因此构建的模型往往更准确 ...

  4. 经典算法详解(8)数的分组

    题目:有10个任意的正整数,将其分为两组A和B,要求组A中每个数据的和与组B中每个数据的和之差的绝对值最小.请设计算法实现数的分组(找出一个答案即可). C++版本: 1 #include<io ...

  5. 起名算法 php,PHP实现各种经典算法详解

    //-------------------- // 基本数据结构算法 //-------------------- //二分查找(数组里查找某个元素) function bin_sch($array, ...

  6. 经典算法详解(2)寻找数组中的次大数

    题目:10个互不相等的整数,求其中的第2大的数字,要求数组不能用排序,设计的算法效率越高越好. 1 #include<iostream> 2 3 using namespace std; ...

  7. sporadic偶发实时任务多核分区动态优先级EDF(或者DM)调度(以及可调度性分析)经典算法详解

    sporadic任务的概念:实时任务分类与术语_标biao的博客-CSDN博客,也就是任务的截止期可以小于周期. with no loss of generality,任务集为封闭任务集,不会运行时动 ...

  8. 经典算法详解(10)图中有多少个三角形

    题目:请说出下面图形中包含多少个三角形?请用一个程序完成计算. C++版本 1 #include<iostream> 2 3 using namespace std; 4 5 const ...

  9. AnchorFree系列算法详解

    目录 前言 一.Anchor-Based方法回顾 二.Anchor Free系列方法简介 1. Anchor Free系列算法历史 2. Anchor free经典算法详解 2.1. 基于关键点的An ...

最新文章

  1. 英雄联盟手游超燃测试服务器维护,《英雄联盟手游》超燃测试放号开启,轻松教你获得测试资格...
  2. C语言——第四次作业
  3. 《设计模式之禅》学习笔记(一)
  4. JavaScript 事件入门知识
  5. tia v15 添加项目_西门子S7-1500plc与S7-300plcPN/IO设备通信-创建项目
  6. LiveVideoStack线上分享第三季(七):AVS3关键技术介绍、性能和复杂度分析
  7. 100个网络基础必备知识 ,值得收藏!
  8. 中科大博士写外挂被抓,非法牟利300多万!
  9. Cgroups控制cpu,内存,io示例
  10. nginx搭建视频服务器
  11. 强化学习实战——Q learning 实现倒立摆
  12. python课设答辩ppt_学生成绩管理系统答辩幻灯片.ppt
  13. Linux打印添加水印,linux下word转pdf,加水印
  14. bilibili视频下载器v1.0.5 支持4K超清
  15. java web英语单词系统
  16. 使用Python+PCA+SVM算法实现人脸识别模型
  17. 北京市社会保险办理流程
  18. 什么是多态?为什么使用多态?
  19. Cg学习之01_vertex_program
  20. 操作系统总结(二)系统调用及系统结构

热门文章

  1. Github Star 8.4K,超级好用的OCR数据合成与半自动标注工具,强烈推荐!
  2. 30万总奖金·垃圾分类挑战赛进入最后冲刺(附baseline完整分享)
  3. 精英赛上线|冠军万元奖金
  4. OpenCV4.0 Mask RCNN 实例分割示例 C++/Python实现
  5. 锻炼编程能力的10个游戏:通关既巅峰!
  6. 赞!清华大学发布首个自动图机器学习工具包AutoGL
  7. 计算机网络配置调试综合实验,计算机网络设备配置与调试课程标准.doc
  8. java静态类如何赋值_Java class对象说明 Java 静态变量声明和赋值说明
  9. word整个表格首行缩进_Word排版对不齐?别忘了这个明星按键
  10. 小学教师计算机应用水平和能力,中小学教师信息技术应用能力的现状与对策