定义(个人理解)

1.自己调用比自己小一个规模的自己

2.有结束条件。

3.对问题的细化

ps: 大家可以通过这个效应感性的感受一下递归。

德罗斯特效应:

************************************************************************************************************************************************

递归条件

当然并不是所有的问题都能够用递归来实现。能够实现递归,需要满足以下条件:
1.有递归公式。问题能够分解为一个一个于自身类似的小问题。
2.确切的边。能够最后分解为一个有确定解的问题。
辅助分析图:
个人觉得,这个图应该是能够比较清晰地反映递归的调用了。
我们可以把递归调用看作是在原本的f()函数中又添加了f()函数的代码,只是现在的参数与原来不同罢了。只有当到达边界的时候,函数才会一层一层的被返回。也就是一个一个的问题被完成返回后,最外层的函数才会真正被完成也返回。

不太懂?没关系,咱们从实例中去理解递归~
************************************************************************************************************************************************

经典例题(个人分析)

该排版由易到难,请各位看客根据自己的需求翻阅。

阶乘

问题描述:请输入一个n值,输出n!的值。
code:
运行结果:
变式1:完成Fibonacci数列
变式2:完成Ackerman函数
(答案在最后~)
是不是觉得递归很简单呢?下面咱们再继续吧~
****************************************************************************************************************

汉诺塔问题

问题描述:假设有3个分别命名为X、Y和Z的塔座,在塔座X上插有n个直径大小各不相同、按从小到大编号为1,2,..., n的圆盘(如图所示)。现要求将X轴上的n个圆盘移至塔座Z上并仍按同样顺序叠排,圆盘移动时必须遵循下列规则:
(1)每次只能移动一个圆盘;
(2)圆盘可以插在X、Y和Z中的任一塔座上;
(3)任何时刻都不能讲一个较大的圆盘压在较小的圆盘之上。
请问如何移?要移多少次?
code:
运行结果:
如果感觉有点晕的话也可以:
1.采取最开始解释的方法去看,就是在原来最开始的函数中添加了代码。
2.带入实际数据进去跟着程序运行一遍。

3.看下面动图~

汉诺塔栈方法解决:http://www.cricode.com/304.html
****************************************************************************************************************

八皇后问题

问题描述:经典的八皇后问题,即在一个8*8的棋盘上放8个皇后,使得这8个皇后无法互相攻击( 任意2个皇后不能处于同一行,同一列或是对角线上),输出所有可能的摆放情况。
code:
#include <iostream>
using namespace std;
int c[20],n=8,cnt=0;
void print(){ //打印for(int i=0;i<n;++i){for(int j=0;j<n;++j){if(j==c[i])cout<<"1 ";else cout<<"0 ";}cout<<endl;}cout<<endl;
}
void search(int r){if(r==n){ //当已经排到最后一个皇后的时候位置一定固定。【条件2】print();++cnt;return;}for(int i=0;i<n;++i){ //r表示第几行c[r]=i; //c[r]=i,表示第r行第i列int ok=1;for(int j=0;j<r;++j)if(c[r]==c[j]||r-j==c[r]-c[j]||r-j==c[j]-c[r]){ //判断是否在同一列,是否在主对角线或副对角线上【条件1】ok=0;break;}if(ok)search(r+1); //r+1必定不在同一行,故不用判断是否在一行}
}
int main(){search(0);cout<<cnt<<endl;return 0;
}

运行结果部分截屏:

****************************************************************************************************************
Answer:
变式1:使用公式f[n]=f[n-1]+f[n-2],依次递归计算,递归结束条件是f[1]=1,f[2]=1。
变式2:使用公式Ack(m,n)=Ack(m-1,Ack(m,n-1)),依次递归计算,递归结束条件n=0时,Ack(m,n)=Ack(m-1,1);m=0时,Ack(m,n)=n+1。

【算法】递归(recursion)+经典例题个人分析相关推荐

  1. [算法系列] 深入递归本质+经典例题解析——如何逐步生成, 以此类推,步步为营

    [算法系列] 深入递归本质+经典例题解析--如何逐步生成, 以此类推,步步为营 本文是递归系列的第三篇, 第一篇介绍了递归的形式以及递归设计方法(迭代改递归),;第二篇以递归为引子, 详细介绍了快排和 ...

  2. 【算法基础】经典例题说递归

    目录 [算法基础]经典例题说递归 递归简介 递归的适用范围 递归的基本思路 经典例题解析 移梵塔 题目描述 题目分析 题解 九连环 题目描述 题目分析 题解 更新日志 [算法基础]经典例题说递归 递归 ...

  3. 古老的密码(Ancient Cipher,UVa1339)(算法竞赛入门经典 例题4-1)C++

    题目:给定两个不超过100的字符串,判断是否可以做到将其中一个字符串通过重排和映射的操作,使得两个字符串相同.例如,JWPUDJSTVP重排后可以得到WJDUPSJPVT,然后每个字母只要通过一次映射 ...

  4. C语言递归及经典例题详解

    什么是递归? 什么时候使用递归 例题1 顺序打印问题 例题2 求n的阶乘 例题3 求第n个斐波那契数 经典 汉诺塔问题 经典 青蛙跳台阶问题 什么是递归? 递归就是程序调用自身的编程技巧.递归通常把一 ...

  5. 算法竞赛入门经典 例题6-2 铁轨(C、python)

    同个人网站 https://www.serendipper-x.cn/,欢迎访问 ! 问题描述: 某城市有一个火车站,铁轨铺设如图所示.有n节车厢从A方向驶入车站,按进站顺序编号为 1~n .你的任务 ...

  6. 总结 贪心算法_用经典例题轻松帮你搞定贪心算法

    转自:奶糖猫 贪心算法概念叙述 运用贪心算法求解问题时,会将问题分为若干个子问题,可以将其想象成俄罗斯套娃,利用贪心的原则从内向外依次求出当前子问题的最优解,也就是该算法不会直接从整体考虑问题,而是想 ...

  7. 算法竞赛入门经典 例题6-6 小球下落(python、C)

    同个人网站 https://www.serendipper-x.cn/,欢迎访问 ! 问题描述: 有一颗二叉树,最大深度为D,且所有叶子的深度都相同.所有结点从上到下从左到右编号为 1,2,3,- , ...

  8. 算法竞赛入门经典 例题6-21

    UVa506 System Dependencies 编写程序实现类似Linux下的软件包管理器,其工作方式为: 可以通过命令显式安装组件,这个过程也可能隐式安装依赖组件 如果没有其它组件仍然依赖一个 ...

  9. 算法竞赛入门经典 例题6-16

    刷题荒废了一个多月,今日了却一件事情,把此题补上! UVa10129 Play on Words 有若干个圆盘,每个圆盘上都有一个单词,判断这些圆盘是否能排成一排,使得相邻圆盘的首尾字母相同. 3年前 ...

最新文章

  1. ubuntu18下配置VS Code
  2. 转行python经验_【经验分享】转行如何自学Python并且找到工作,分享自己心得
  3. linux下c语言按q退出_Linux C编程之一:Linux下C语言的开发环境
  4. 别人给你网盘分享东西怎么搞到电脑上看呢?
  5. NYOJ 300 hdu 2276 Kiki Little Kiki 2 (矩阵快速幂)
  6. [转载]:合并两个已排序好的int数组,并排序返回c#实现
  7. python操作access数据库未发现数据源名称_ASP连接ACCESS数据库失败,提示“未发现数据源名称并且未指定默认驱动程序”...
  8. 深入解析hostname
  9. 支持多浏览器的js拖拽 (转domkey0303 的blog)
  10. UBUNTU中更改文件的打开方式
  11. 【POJ2318】TOYS(点在凸多边形内判定---模版暴力/二分)
  12. 准银河字母、当铺密码、摩斯电码详解
  13. 梯度和法向量的统一理解
  14. 中病毒了文件夹变exe文件找到方法
  15. 计算机研究生论文怎怎么写,计算机硕士研究生论文大纲格式 计算机硕士研究生论文大纲怎样写...
  16. 2019-10 前端技术汇总
  17. 使用ViewPager实现轮播图自动播放
  18. JavaScript补环境及AST实战
  19. 专题五 在Cisco Packet Tracer中设计基于 PT 和 OneNet 的智能家居系统
  20. JAVA计算机毕业设计上虞烟草物流配送系统(附源码、数据库)

热门文章

  1. volatile限定符——C++讲解
  2. JS节点操作、节点层级获取
  3. 基于python和opencv的图像分割旋转裁剪
  4. P20到P23js知识点
  5. (附源码)ssm高校实验室系统 毕业设计 800008
  6. 相遇,是天意; 相守,是人意
  7. 数据结构 单词查找 二分法-索引表-Hash表
  8. ubuntu中rar与unrar用法详解
  9. 深度学习算法之-SSD(一)
  10. X站全称是什么_站群的狂欢已经远去,还能拿什么年入百万?