一、  什么是递归

程序调用自身的编程技巧称为递归( recursion)。

递归做为一种算法程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

注意:
递归就是在过程或函数里调用自身;

举个例子来说:

从前有座山,山上有座庙,庙里有一个老和尚和一个小和尚,老和尚正在给小和尚讲故事。

讲的是什么故事呢?他说,从前有座山,山上……

我们发现这个故事是一直重复讲述的,我们之前是通过循环结构来实现重复执行某些代码的,那么如何通过递归代码来实现这个故事呢? 我们来看下面这段代码:

#include "windows.h"

void   tell_story( )

{

       printf("从前有座山,山上有座庙,庙里有一个老和尚和一个小和尚\n");

       printf("老和尚正在给小和尚讲故事。讲的是什么故事呢?他说:\n");

       Sleep();

       tell_story ( );      // tell_story 函数的递归调用

}

void main()

{

   tell_story( );

}

我们发现, 通过递归调用,也就是函数调用自身这一方法来实现讲故事这以代码,代码是可以执行的,但是却形成了一个死循环.之前我们学习循环的时候,我们对循环是有控制条件的,那么在我们使用递归的时候是否应该和使用循环一样,应该有个控制递归的条件呢?这个控制条件应该是什么呢?

注意:
递归就是在过程或函数里调用自身;
在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。

汉诺塔游戏代码

/* 汉诺塔游戏解决过程*/
#include "stdio.h"
//整型全局变量,预置1,步数
int step=;
//void表示该函数没有返回值,只是执行了一些操作
void move(int m,char p,char q,char r)
{
if(m==) //如果m为1,则为直接可解结点
{
//输出移盘信息
printf("第%d步 move 1# from %c to %c\n",step,p,r);
//步数加1,准备进行下一步
step++;
}
else
{
move(m-,p,r,q);//递归调用move(m-1)
//直接可解结点,输出移盘信息
printf("第%d步 move %d# from %c to %c\n",step,m,p,r);
//步数加1
step++;
//递归调用
move(m-,q,p,r);
}
} void main()
{
int n;
printf("请输入盘数:");
scanf("%d",&n);
printf("在3根柱子上移%d只盘的步骤为\n",n);
move(n,'A','B','C');
}

斐波那契数列代码

/* Note:Your choice is C IDE */
#include "stdio.h"
int fun(int n)
{
if(n==||n==)
return ;
else
return fun(n-)+fun(n-);
} void main()
{
int n;
printf("请输入月数:");
scanf("%d",&n);
printf("%d月有%d对兔子\n",n,fun(n)); }

递归 求阶乘

#include "stdio.h"
int fun(int n)
{
if(n==)
return n;
else
return n*fun(n-);
} void main()
{
int n;
printf("请输入一个数:");
scanf("%d",&n);
printf("%d!=%d\n",n,fun(n)); }

c语言进阶5-递归算法的更多相关文章

  1. 【R笔记】R语言进阶之4:数据整形(reshape)

    R语言进阶之4:数据整形(reshape) 2013-05-31 10:15 xxx 网易博客 字号:T | T 从不同途径得到的数据的组织方式是多种多样的,很多数据都要经过整理才能进行有效的分析,数 ...

  2. 《C语言进阶剖析》课程目录

    <C语言进阶剖析>学习笔记                                                         本文总结自狄泰软件学院唐佐林老师的<C语言 ...

  3. 彩虹女神跃长空,Go语言进阶之Go语言高性能Web框架Iris项目实战-项目入口与路由EP01

    书接上回,我们已经安装好Iris框架,并且构建好了Iris项目,同时配置了fresh自动监控项目的实时编译,万事俱备,只欠东风,彩虹女神蓄势待发.现在我们来看看Iris的基础功能,如何编写项目入口文件 ...

  4. R语言进阶

    一.初学入门:<R in Action><The Art of_R Programming>入门者可首选两本,前者从统计角度入手,分高中低三部分由浅入深的讲解了如何用R来实现统 ...

  5. C 语言 进阶

    清单狂魔,只挖坑不填坑.. 前言 最近经常被询问 C 语言 相关的问题,突然便也觉得需要思考一下 C 语言的进阶了. 我用 C 语言写过的最大的一个项目,也只是那个贪吃蛇,后来就断断续续地用 Pyth ...

  6. 编程C语言进阶篇——自定义数据类型:共同体

    什么是"自定义数据类型"?顾名思义,就是用户可以随时在程序中自行定义新的数据类型.自定义数据类型时需要设置数据类型的名称及其成员.数据类型成员各属性的设置方法等同于变量设置时相应属 ...

  7. 编程C语言进阶篇——自定义数据类型:结构体

    一.结构体 定义方法: 结构名 变量名 特点: 两个同类型的结构变量可以相互赋值,但是结构变量之间不能使用"<","=="等运算符,如果使用则需要对运算符 ...

  8. 苹果新的编程语言 Swift 语言进阶(六)--函数和闭包

    一 .函数 1.1. 函数的定义和调用 函数的定义以funckeyword作为前缀,接着是函数名字,接着跟着一个能够带有參数.也能够不带參数的圆括号.接着用-> 指示函数的返回类型. 函数运行体 ...

  9. 苹果新的编程语言 Swift 语言进阶(五)--控制流

    Swift 语言支持C语言全部的控制语句.包含for  和while循环语句,if和switch条件语句,以及break和continue控制语句等. Swift 语言除了支持以上语句,还添加了一个f ...

  10. 苹果新的编程语言 Swift 语言进阶(十二)--选项链

    选项链是使用选项来查询和调用其属性.方法或下标的一个过程,假设选项包括一个值,则属性.方法.下标的查询和调用成功,否则,调用返回nil. 选项链能用在不论什么类型的选项来检查对其一个属性.方法.下标的 ...

随机推荐

  1. 2015新款 MacBook 用心的测评与试用. 最轻薄的Mac上市

    2015新款 MacBook 不一样的测评与试用. 最轻薄的Mac上市了. 直击现场 <HTML开发MacOSApp教程>  http://pan.baidu.com/s/1jG1Q58M ...

  2. 用了WS_EX_LAYERED 后所有Twincontrl的wm_paint消息会停止(官方Layered Windows文档很多内容)good

    fmx 和 vcl 不一样, fmx 的阴影可以通过2D显示出来. VCL 无标题栏窗口的阴影很麻烦 280425268 我也是用两个窗口做阴影,并重绘了非客户区,不过阴影是基础自TwinContro ...

  3. MAC和PHY的区别(网线上传递的是模拟信号)

    一块以太网网卡包括OSI(开方系统互联)模型的两个层.物理层和数据链路层.物理层定义了数据传送与接收所需要的电与光信号.线路状态.时钟基准.数据编码和电路等,并向数据链路层设备提供标准接口.数据链路层 ...

  4. 台电P89s mini root教程

    根据论坛内的一些内容再结合自己的使用心得整理如下,本人双11购入P89s mini root成功  自带软件什么的都不见了 以下是个人root过程,有不一样的地方欢迎交流,说实话我也不是很懂 1.升级 ...

  5. orm多表操作

    一.创建表 1.一对多 必须在"多"的表中创建关联字段,在外加约束 class Book(models.Model): id=models.AotuField(primary_ke ...

  6. spring boot热部署devtools

    1 pom.xml文件 注:热部署功能spring-boot-1.3开始有的 <!--添加依赖--> <dependency> <groupId>org.sprin ...

  7. string类总结第一部分函数介绍

    在前面几章,看了整个String类的源码,给每个方法都行写了注释,但是太过凌乱,今天我就把String类的方法整理归纳,然后再讲一下String类比较难以理解的部分 特此声明:本文篇幅较大,涵盖知识点 ...

  8. (持续更新)Qt3D 学习资源

    目录 一.前言 1.1 什么是Qt3D 1.2 Qt3D 的利与弊 利:原生支持 弊处:资料过少 二.学习建议 2.1 OpenGL 学习资料 2.2 Qt3D 资料 2.2.1 视频资料 2.2.4 ...

  9. JavaScript 常见的六种继承方式

    JavaScript 常见的六种继承方式 前言 面向对象编程很重要的一个方面,就是对象的继承.A 对象通过继承 B 对象,就能直接拥有 B 对象的所有属性和方法.这对于代码的复用是非常有用的. 大部分 ...

  10. 5分钟快速部署DataDraw数字绘

    经常有小伙伴问,有没有一款好用又免费的画图软件,画画流程图.UML.思维导图?今天就介绍一款开源的在线画图软件,满足各方面人的需求. DataDraw数字绘是一个在线线框图.流程图.网络图.组织结构图 ...