一、什么是递归算法?

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

一个过程(或函数)直接或间接调用自己本身,这种过程(或函数)叫递归过程(或函数).

二、递归算法原理、特点、要求及实现

原理

递归过程一般通过函数或子过程来实现。递归方法:在函数或子过程的内部,直接或者间接地调用自己的算法。

特点

递归算法是一种直接或者间接地调用自身算法的过程。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。

递归算法解决问题的特点:

(1) 递归就是在过程或函数里调用自身。

(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。

(3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。

(4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。

要求

递归算法所体现的“重复”一般有三个要求:

1)是每次调用在规模上都有所缩小(通常是减半);

2)是相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入);

3)是在问题的规模极小时必须用直接给出解答而不再进行递归调用,因而每次递归调用都是有条件的(以规模未达到直接解答的大小为条件),无条件递归调用将会成为死循环而不能正常结束。

三、C语言程序代码

#include

#define swap(x,y,t)((t)=(x),(x)=(y),(y)=(t))

void  perm(char *list,int q,int p);

int count;

int main(void)

{

char list[]="abcd";

perm(list,0,3);//0是第一个元素的下标,2是最后一个元素的下标

printf("总共有%d中排列",count);

return 0;

}

void  perm(char *list,int q,int p)//排序函数

{

char tmp;

int i;

if(q==p)

{

printf("%s\n",list);

count++;

}

else

{

for(i=q;i<=p;i++) //第一次q=0,p=2,第二次q=1,第三次q=2

{

swap(list[i],list[q],tmp);

perm(list,q+1,p);

swap(list[i],list[q],tmp);

}

}

//a开头的,后面是bc的所有排列

//swap(list[0],list[0],tmp);

//perm(list,1,2);

//swap(list[0],list[0],tmp);

//b开头的,后面是ac的所有排列

//swap(list[0],list[1],tmp);//a和b交换

//perm(list,1,2);

//swap(list[0],list[1],tmp);

//c开头的,后面是ab的所有排列

//swap(list[0],list[2],tmp);//a和c交换

//perm(list,1,2);

//swap(list[0],list[2],tmp);

}

perm函数c语言_C语言之递归排序算法相关推荐

  1. 电子英汉词典c语言程序设计报告,英汉电子词典设计报告_设计_C语言_C语言程序设计.doc...

    英汉电子词典设计报告_设计_C语言_C语言程序设计 课程设计 课程名称 :C语言程序课程设计 题目名称 :电子英汉词典 学生学院 :电气信息学院 专业班级 :自动化1101 学 号 :20110102 ...

  2. C语言中的几种排序算法

    C语言中的几种排序算法 在编程练习时,我们经常会遇到一些将一串乱序的数字排列成有序的数列(递增,递减)的问题,以此起到解决问题的效果.目前我使用的比较熟练的有三种排序算法,冒泡排序法,快速排序法,另外 ...

  3. 我们一起来排序——使用Java语言优雅地实现常用排序算法

    破阵子·春景 燕子来时新社,梨花落后清明. 池上碧苔三四点,叶底黄鹂一两声.日长飞絮轻. 巧笑同桌伙伴,上学径里逢迎. 疑怪昨宵春梦好,元是今朝Offer拿.笑从双脸生. 排序算法--最基础的算法,互 ...

  4. c语言prime函数怎么用_C语言教程_v20201106

    编程基础 1.1    通俗地理解什么是编程语言 1.2    C语言究竟是一门怎样的语言? 1.6    初中毕业能学会编程吗? 1.7    C和C++到底有什么关系? 1.8    学了 C 语 ...

  5. c语言程序 中断函数示例,单片机_C语言函数_中断函数(中断服务程序)

    c语言中的中断函数注意事项 单片机_C语言函数_中断函数(中断服务程序) 在开始写中断函数之前,我们来一起回顾一下,单片机的中断系统. 中断的意思(学习过微机原理与接口技术的同学,没学过单片机,也应该 ...

  6. C进阶_C语言_函数与指针_C语言指针进阶

    上一篇博客http://t.csdn.cn/GYCiM 我们了解了指针相关知识,今天来了解函数和指针的关系. 目录 函数指针 函数指针数组 指向函数指针数组的指针 回调函数 qsort 冒泡排序模拟实 ...

  7. char类型怎么输入 c语言_C语言零基础入门到精通视频课程(精品)

    C语言入门 C语言一经出现就以其功能丰富.表达能力强.灵活方便.应用面广等特点迅速在全世界普及和推广.C语言不但执行效率高而且可移植性好,可以用来开发应用软件.驱动.操作系统等.C语言也是其它众多高级 ...

  8. cshop是什么开发语言_C语言是用什么语言编写出来的?

    谢邀 参考 Dennis M. Ritchie 写的 The Development of the C Language:Chistory,C 语言诞生的基本过程就是 Ken Thomson 不满意 ...

  9. 职高计算机专业c语言_C语言在中职计算机专业课程中的重要作用探究

    摘 要:在中职计算机教学中,C语言是计算机专业学生必备的基本技能之一,同时也是一门基础课程.C语言具有强大的功能和广泛的应用,在相关的科技领域中,已经日趋完善和发展.结合C语言的特点,进一步指出了C语 ...

  10. 会员计费系统c语言_c语言课程设计报告会员卡计费系统源代码

    #include <>                  .\n"); goto a;                                               ...

最新文章

  1. PHP常用正则表达式汇总 [复制链接]
  2. golang go-restful RESTful框架 简介
  3. 南宁网络推广浅谈能使文章快速收录的技巧有哪些?
  4. 网站用域名能访问,用域名IP不能访问的原因分析
  5. C++ Primer 5th笔记(chap 16 模板和泛型编程)重载与模板
  6. reactjs使用eject暴露webpack核心配置
  7. .netcore 整合 log4net
  8. 演讲实录:MySQL 8.0 中的复制技术
  9. 24.redis持久化之AOF
  10. ajax escape用法,ie11下ajax用escape发送中文参数失败
  11. Exch:POP3 和 IMAP4 操作指南
  12. 《Gartner2016年度新兴技术成熟度曲线》全解读
  13. windows下sqlmap清除缓存记录
  14. jquery 处理页面的事件详解
  15. Excel填充空白的单元格
  16. 企业发放的奖金根据利润提成。
  17. 数据结构课程主页-2016级
  18. manjaro-i3wm 新装系统没有声音问题解决
  19. 学习bash第二版-前言
  20. 介绍 Q_DECLARE_PRIVATE与Q_DECLARE_PUBLIC

热门文章

  1. 人工智能反欺诈三部曲——设备指纹
  2. KEPServerEX与三菱iQ-R系列PLC通讯
  3. 自建CDN防御DDoS(2):架构设计、成本与部署细节
  4. 自建CDN技术选型: squid varnish nginx
  5. css添加 渐变色 阴影
  6. 火狐 翻译插件_即时语言翻译进入Firefox
  7. 机顶盒ipanel中间件 升级说明
  8. 腾讯股票接口API(2)——根据股票代码获取K线数据
  9. 台式计算机噪声,台式电脑主机突然发出很大的噪音怎么办呢
  10. ITL(Interested Transaction List)理解