cuicuiv小白学算法—递归

递归:是指在函数的定义中又调用函数自身的方法。

使用递归求解的问题需要满足一下三个条件:

  1. 需要解决的问题可以转化为一个或多个子问题来求解,而这些子问题的求解方法与原问题完全相同,只是在数量规模上不同。
  2. 递归调用的次数必须是有限的。
  3. 必须有结束递归的条件来终止递归

提取递归模型的步骤

  1. 对原问题f(sn)进行分析,抽象出合理的“小问题”f(sn-1)
  2. 假设f(sn-1)是可解的,在此基础上确定f(sn)的解,即给出f(sn)和f(sn-1)之间的关系
  3. 确定一个特定情况(如f(1)和f(0))的解,由此作为递归的出口

基于递归数据结构的递归算法设计

例—二叉树的递归算法设计

假设二叉树采用二叉链存储结构,设计一个递归算法释放二叉树bt中的所有结点。


设f(bt)的功能是释放二叉树bt的所有结点,则f(bt->lchild)的功能是释放二叉树bt的左子树的所有结点,f(bt->rchild)的功能是释放二叉树bt的右子树的所有结点。即f(bt)是“大问题”,f(bt->lchild)和f(bt->rchild)是两个“小问题”
对应的递归模型如下:
f(bt)=不做任何事情 ********************************** 当bt=NULL时
f(bt)=f(bt->lchild);f(bt->rchild);释放bt所指的结点 ***其他情况
*
对应的递归算法:
void DestroyBtree(BTNode *&bt)
{ if(bt!=NULL)
{
DestroyBtree(bt->lchild);
DestroyBtree(bt->rchild);
ftee(bt);
}
}

基于归纳思想的递归算法设计

从本质上来讲,给出一个带有参数n的问题,采用基于归纳思想设计递归算法是基于这样一个事实。
如果知道求解带有参数k(<n)的同样问题,那么整个任务就转化成如何把解法扩展到带有参数k的情况。实际上就是以f(n)为“大问题”,以f(n-1)或者f(n/2)等为“小问题”,归纳出大小问题之间的递推关系。

基于归纳思想的递归算法设计通常不像基于递归数据结构的递归算法设计那样直观,需要通过对求解问题的深入分析提炼出求解过程中的相似性而不是数据结构的相似性,这就增加了算法设计的难度。

简单选择排序和冒泡排序
【问题描述】 对于给定的含有n个元素的数组a,分别采用简单选择排序和冒泡排序方法按元素值递增排序


简单选择排序和冒泡排序方法都是按a[0···n-1]分为有序区a[0····i-1]和无序区两个部分,有序区中的所有元素都不大于无序区中的元素,初始时有序区为空(即i=0)。经过n-1趟排序(i=1~n-2),每趟排序采用不同方式将无序区中的最小元素移动到无序区的开头。


1.简单选择排序

简单选择排序采用简单比较方式在无序区中选择最小元素并放到开头处。
设f(a,n,i)用于在无序区a[i···n-1](共n-i个元素)中选择最小元素并放到a[i]处,是“大问题”,则f(a,n,i+1)用于在无序区a[i+1····n-1]中选择最小元素放到a[i+1]处,是“小问题”。当i=n-1时所有元素有序,算法结束。


对应递归模型:
f(a,n,i) 不做任何事情,算法结束****************************当i=n-1时
f(a,n,i) 通过简单选择比较挑选a[i···n-1]中最小的元素;***否则
a[k]放到a[i]出;f(a,n,i+1);

代码如下:

#include<stdio.h>
void swap(int &x,int &y) //交换x和y的值
{int tmp=x;x=y;y=tmp;
}void disp(int a[],int n) //输出a中的所有元素
{for(int i=0;i<n;i++)printf("%d",a[i]);printf("\n");
}void SelectSort(int a[],int n,int i) //递归的简单选择
{int j,k;if(i==n-1) return; //满足递归出口else
{k=i;//k记录a [i ```n-1]中最小元素的下标for(j=i+1;j<n;j++)//在a[i```n-1]中找最小元素a[k]{if(a[j]<a[k])k=j;if(k!=i)//若最小元素不是a[i]swap(a[i],a[k]);//a[i]和a[k]交换SelectSort(a,n,i+1);}
}
}
void main()
{int n=10;int a[]={2,5,1,7,10,6,9,4,3,8};printf("排序前:");disp(a,n);SelectSort(a,n,0);printf("排序后:");disp(a,n);
}

简单选择排序通过两两对比一一得出最小元素,通过递归实现全部排列,最后通过递归出口结束。


2.冒泡排序

冒泡排序采用交换方式将无序区中的最小元素放到开头处。


设f(a,n,i)用于将无序区 a[i···n-1] 中的最小元素交换到a[i]处,是”大问题“,则f(a,n,i+1)用于将无序区a[i+1···n-1]中的最小元素交换到a[i+1]处,是”小问题“。当i=n-1时所有元素有序,算法结束。


对应递归模型:
f(a,n,i) 不做任何事情,算法结束************************当i=n-1时
f(a,n,i) 对a[i ···n-1]中的元素序列从a[n-1]开始进行相邻比较***否则
若相邻两元素反序则将两者交换;
若没有交换则返回,否则执行f(a,n,i+1)

代码如下:

#include<stdio.h>
void swap(int &x,int &y) //交换x和y的值
{int tmp=x;x=y;y=tmp;
}void disp(int a[],int n) //输出a中的所有元素
{for(int i=0;i<n;i++)printf("%d",a[i]);printf("\n");
}void BubbleSort(int a[],int n,int i) //递归的冒泡排序
{int j;bool exchange;if(i==n-1) return; //满足递归出口条件else{exchange=false;for(j=n-1;j>i;j--)if(a[j]<a[j-1]) // 当相邻元素方序时{swap(a[j],a[j-1]);exchange=true;} if(exchange==false) //未发生交换时直接返回return;elseBubbleSort(a,n,i+1);}
}
void main()
{int n=10;int a[]={2,5,1,7,10,6,9,4,3,8};printf("排序前:");disp(a,n);SelectSort(a,n,0);printf("排序后:");disp(a,n);
}

**

总结:

1. 面对问题求解选择方法时,先判断题目对象的条件,以其数据结构以及数学模型为参考。
2. 用递归求解题目主要分为两大类:
(1)基于递归数据结构的递归算法设计 (2)基于归纳思想的递归算法设计
3.使用递归时,对“大问题”和“小问题”的判断以及划分以及递归出口条件极为重要。

算法设计学习---递归相关推荐

  1. 基于双向LSTM的影评情感分析算法设计学习记录

    引言 需求分析,技术可行性(目前的研究进度),主流怎么做?我要如何做? 随着互联网技术的飞速发展及联网的便捷,越来越多的人在网上表达自己的意见.其中,电影评论受到广泛关注.很多人选择在闲暇时间观看电影 ...

  2. 算法设计与分析之循环与递归

    前言: 循环与递归可以说是算法设计中最基本但却也是最重要的工具方法.循环和递归对于学习过高级程序设计语言的人来说都并不陌生,但还是有必要仔细的探究一下循环和递归之间的相似和区别.循环与递归最大的相似之 ...

  3. 基于强化学习的五子棋算法设计-python代码完整实现

    目录 1  课程设计目的 2  设计任务与要求 3  设计原理 3.1  强化学习 3.2  蒙特卡洛树搜索 4  模型介绍 4.1  模拟 4.2  走子 4.3  神经网络 5  仿真过程与结果 ...

  4. 算法设计方法:递归的内涵与经典应用

    摘要: 大师 L. Peter Deutsch 说过:To Iterate is Human, to Recurse, Divine.中文译为:人理解迭代,神理解递归.毋庸置疑地,递归确实是一个奇妙的 ...

  5. 数据结构与算法学习③(Hash hash算法的工程应用 递归 )

    Hash Hash 散列表(Hash Table) 概述 散列函数 散列冲突 复杂度分析 工程应用 面试实战 亚马逊,微软最近面试题,242. 有效的字母异位词 腾讯,高盛集团最近面试题,49. 字母 ...

  6. 汤晓鸥谈深度学习三大核心要素:算法设计、高性能的计算能力以及大数据

    汤晓鸥谈深度学习三大核心要素:算法设计.高性能的计算能力以及大数据 2017-05-21 15:02:28    深度学习    0 0 0 昨日(5月20日),香港中文大学汤晓鸥教授莅临 2017C ...

  7. 算法设计与分析——递归与分治策略——全排列

    算法设计与分析--递归与分治策略--全排列 全排列问题的解决是通过分治与递归思想来解决的 首先判断是否递归到了最后一位,如果递归到了最后一位,则输出他当前的全排列序列. 如果没有到达最后一位,则循环的 ...

  8. 【算法】学习笔记(2):递归思想

    0 回顾 之前的笔记(0)和笔记(1),我们介绍了算法的基本含义,并且举了一些实例,同时理解了,算法就是人类在教计算机做事情! 我们知道,算法就是解决问题的方案,我们将自然语言描述的问题,转换为符号语 ...

  9. 算法设计和数据结构学习_2(常见排序算法思想)

    一般约定我们是按照从小到大的顺序排序. 按照向量的形式来参考排序中数组元素的相对位置,行向量中最左边为数组的第一个元素,且称为前面.列向量中最上面的元素为数组的第一个元素,也是称为前边. 对常见的排序 ...

最新文章

  1. 领英Linkedin信息搜集工具InSpy
  2. [Linux] ubuntu 格式化u盘
  3. Python基础:对象的深拷贝和浅拷贝的区别
  4. 通过sql-labs进行sql注入学习(11-22)
  5. cad中简单流程图制作_想要又快又好的画出世界级的流程图,这样牛掰的方法一定要知道...
  6. python3-开发进阶-仿博客园项目setting.py的文件的配置,admin,forms(2)
  7. 【Pytorch神经网络实战案例】40 TextCNN模型分析IMDB数据集评论的积极与消极
  8. oracle10g rac升级到10.2.0.5
  9. java设计模式并发_[高并发Java 七] 并发设计模式
  10. mAP(mean Average Precision)应用(转)
  11. 为什么公司要对员工的薪资保密?
  12. grumble.js
  13. Tableau宣布退出中国市场,背后的原因细思恐极...
  14. RPG Maker MV如何导入dlc素材?
  15. quicktime不能成功安装
  16. matlab心线代码,matlab心形线
  17. 第28课:彻底解密Spark Sort-Based Shuffle排序具体实现内幕和源码详解
  18. 燕山大学——软件用户界面设计(八)原型设计
  19. 【CEGUI】CEGUI入门篇之初始化(一)
  20. Error: mount: 未知的文件系统类型“ntfs”

热门文章

  1. CSDN博客 转移至 个人博客fang0jun.github.io
  2. 计算机游戏流程图,猜数字游戏 流程图+源代码
  3. 【统计学】【2014】双相情感障碍的数学建模、预测和远程监测
  4. 阿里巴巴CEO张勇:数字化是奠定未来发展的基石
  5. 微信签到,弹幕在微信大屏幕上的实现
  6. wyh的物品(二分)
  7. 数组的应用--最值问题
  8. 网络版控制台三国杀结构图
  9. 农历2017年8月初4_2017年8月4日黄道吉日查询,2017年8月4日黄历查询,2017年8月4日吉日查询...
  10. MIR6 校验发票过账时提示移动平均价为负的原因及解决