一、递归的基本概念

递归函数:在定义的时候,自己调用了自己的函数。

注意:递归函数定义的时候一定要明确结束这个函数的条件!

二、函数栈

栈:一种数据结构,它仅允许栈顶进,栈顶出,先进后出,后进先出。我们可以简单的理解为栈就是一个杯子,这个杯子里面有很多隔层,每一层都可以放东西,第一个放入的东西就在杯子最后一层,第二个放入的东西就在倒数第二层,现在我们要取出最后一层的东西,就必须先把第二层的东西给出来。

函数栈:栈里面每一层都是装的都是函数的栈就是函数栈,调用一个函数的时候,这个函数就入栈,这个函数调用完成了(执行到了函数的最后一个语句或者说return了),就出栈。

下面是一个演示函数栈运行机制的C语言程序,并无实际意义,仅用于理解函数栈:

#include<stdio.h>

void function1()
{
printf("function1 done!")
return; //第三步,函数function1调用完毕,出栈
}
void function2()
{
printf("function2 done!")
return; //第五步,函数function2调用完毕,出栈
}
void function3()
{
printf("function3 done!")
return; //第八步,函数function3调用完毕,出栈
}
void function4()
{
printf("function4 done!")
function3(); //第七步,调用函数function3,入栈
return; //第九步,函数function4调用完成,出栈
} int main()//第一步,调用主函数,主函数入栈(这个C语言程序的入口)
{
function1(); //第二步,调用函数function1,入栈
function2(); //第四步,调用函数function2,入栈
function4(); //第六步,调用函数function4,入栈
return 0; //第十步,主函数调用完成,出栈(整个程序执行完成)
}

三、实例

1、阶乘

题目:用递归方法实现计算整数n的阶乘n!

解析:

首先,我们易知0!=1; 1!=1; 2!=2*1!; 3!=3*2!; 4!=4*3!;……

那么我们可以得到递推公式

  • n!=1[n=0,1]
  • n!=n*(n-1)![n>=2]

从而我们就可以写出计算阶乘的递归程序的C语言代码,如下:

#include<stdio.h>

long Fact(int n);

int main()
{
int n;
long result;
printf("Input n:");
scanf("%d",&n);
result = Fact(n);
if(result == -1)
printf("n<0,data error!\n");
else
printf("%d! = %ld\n", n, result);
return 0;
} long Fact(int n)
{
//对传入函数的值判断其合法性
if(n < 0)
{
return -1;
}
//计算n的阶乘的表达式改写的代码
else if(n == 0 || n == 1)
{
return 1;
}
else
{
return (n*Fact(n-1));
}
}

当然,写出来了并不代表我们理解,下图讲解了在这个程序中是如何计算4的阶乘的。

2、Fibonacci数列

题目:实现函数表达式Fib(0)=0,Fib(1)=1,Fib(n)=Fib(n-1)+Fib(n-2)。

解析:在这里题目已经给出了递归表达式,那么我们可以轻松地写出C语言代码。

#include<stdio.h>

int Fib(int n)
{
//判断传入数据的合法性
if(n < 0)
{
return -1;
} //递归表达式改而写的C语言代码
else if(n == 0)
{
return 0;
}
else if(n == 1)
{
return 1;
}
else
{
return Fib(n-1)+Fib(n-2);
}
} int main()
{
int n,result;
printf("Input n:");
scanf("%d",&n);
result = Fib(n);
if(result == -1)
{
printf("A illegal data!");
}
else
{
printf("Fib(%d) = %d", n, result);
}
return 0;
}

关于用Fibonacci数列的在上述程序中如何计算的,我们仍然是通过函数栈进行,具体如何运行在此就不再赘述。

详解递归(基础篇)———函数栈、阶乘、Fibonacci数列的更多相关文章

  1. SpringBoot系列教程JPA之query使用姿势详解之基础篇

    前面的几篇文章分别介绍了CURD中的增删改,接下来进入最最常见的查询篇,看一下使用jpa进行db的记录查询时,可以怎么玩 本篇将介绍一些基础的查询使用姿势,主要包括根据字段查询,and/or/in/l ...

  2. hadoop之mapreduce详解(基础篇)

    本篇文章主要从mapreduce运行作业的过程,shuffle,以及mapreduce作业失败的容错几个方面进行详解. 一.mapreduce作业运行过程 1.1.mapreduce介绍 MapRed ...

  3. 最简单MySQL教程详解(基础篇)之多表联合查询

    在关系型数据库中,我们通常为了减少数据的冗余量将对数据表进行规范,将数据分割到不同的表中.当我们需要将这些数据重新合成一条时,就需要用到我们介绍来将要说到的表连接. 常用术语冗余(Redundancy ...

  4. hadoop之mapreduce详解(进阶篇)

    上篇文章hadoop之mapreduce详解(基础篇)我们了解了mapreduce的执行过程和shuffle过程,本篇文章主要从mapreduce的组件和输入输出方面进行阐述. 一.mapreduce ...

  5. TCP协议详解(理论篇)

    TCP协议详解(理论篇) 2012-08-20      0个评论       作者:陈立龙 收藏    我要投稿 TCP协议详解(理论篇)   1.    与UDP不同的是,TCP提供了一种面向连接 ...

  6. 第7.25节 Python案例详解:使用property函数定义与实例变量同名的属性会怎样?

    第7.25节 Python案例详解:使用property函数定义与实例变量同名的属性会怎样? 一.    案例说明 我们上节提到了,使用property函数定义的属性不要与类内已经定义的普通实例变量重 ...

  7. IIS负载均衡-Application Request Route详解第四篇:使用ARR实现三层部署架构(转载)

    IIS负载均衡-Application Request Route详解第四篇:使用ARR实现三层部署架构 系列文章链接: IIS负载均衡-Application Request Route详解第一篇: ...

  8. [转]ANDROID L——Material Design详解(动画篇)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 转自:http://blog.csdn.net/a396901990/article/de ...

  9. appledoc导出iOS代码文档的使用和问题详解(干货篇)

    appledoc导出iOS代码文档的使用和问题详解(干货篇) 1. 简单说一下背景和自己感受 背景: 项目好像突然黄了,公司让详细写项目代码的注释并且导出文档,弄完之后就要封版. 说实话:听到这个消息 ...

  10. Android为TV端助力 转载:Android绘图Canvas十八般武器之Shader详解及实战篇(上)

    前言 Android中绘图离不开的就是Canvas了,Canvas是一个庞大的知识体系,有Java层的,也有jni层深入到Framework.Canvas有许多的知识内容,构建了一个武器库一般,所谓十 ...

随机推荐

  1. Spring的controller接受Date类型数据,接受枚举类型数据

    1. Controller接收Date类型的数据 核心使用@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") 来将传递过来的时间字符串 ...

  2. 使用shell脚本循环处理文本

    公司是使用puppet来进行配置管理, 某天修改完puppet后领导回复: 我们有一个文档cabinet.txt记录了物理机器所在的机柜, 除了文档里的其他机器都是虚拟机或云服务器, 对虚拟机的pup ...

  3. Mobileye 自动驾驶策略(二)

    Mobileye 自动驾驶策略(二) 与多方都成功进行了合作,其中比较大型的合作包括法雷奥.百度和中国 ITS. 法雷奥是最近的的 Tier 1 合作伙伴,法雷奥和 Mobileye 签署协议,表示未 ...

  4. Javaweb:Servlet

    servlet简介 Servlet(Server Applet)是 Java Servlet 的简称,是使用 Java 语言编写的运行在服务器端的程序.具有独立于平台和协议的特性,主要功能在于交互式地 ...

  5. 【渗透实战】那些奇葩的WAF_第二期_无意发现通杀漏洞,空字节突破上传!

    /文章作者:Kali_MG1937 CSDN博客号:ALDYS4 QQ:3496925334 未经许可,禁止转载/ 该博文为本人18年左右的渗透记录,文法粗糙,技术含量极低,流水账文章,且今日不知为何 ...

  6. 【NX二次开发】Block UI 文本颜色/字体/宽度

    属性说明 常规     类型 描述     BlockID     String 控件ID     Enable     Logical 是否可操作     Group     Logical 是否分 ...

  7. Spring Boot WebFlux-10——WebFlux 实战图书管理系统

    前言 本篇内容我们会实现如下图所示的城市管理系统,因为上面案例都用的是 City,所以这里直接使用城市作为对象,写一个简单的城市管理系统,如图所示: 结构 类似上面讲的工程搭建,新建一个工程编写此案例 ...

  8. 《手把手教你》系列基础篇之(二)-java+ selenium自动化测试-环境搭建(下)基于Maven(详细教程)

    1.简介 Apache Maven是一个软件项目管理和综合工具.基于项目对象模型(POM)的概念,Maven可以从一个中心资料片管理项目构建,报告和文件.由于现在企业和公司中Java的大部分项目都是基 ...

  9. 一个线上 Maven 诡异问题排查过程

    å. 前言 现在的大部分 Java 应用基本都是通过 Maven 进行组织的,不论是分布式应用还是单体集群应用往往都会通过一个 父 POM 加若干子 POM 完成项目的组织.然而这种多应用多模块的拆分 ...

  10. Python的字符串和编码

    1. 字符编码 字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit) ...