详解递归(基础篇)———函数栈、阶乘、Fibonacci数列
一、递归的基本概念
递归函数:在定义的时候,自己调用了自己的函数。
注意:递归函数定义的时候一定要明确结束这个函数的条件!
二、函数栈
栈:一种数据结构,它仅允许栈顶进,栈顶出,先进后出,后进先出。我们可以简单的理解为栈就是一个杯子,这个杯子里面有很多隔层,每一层都可以放东西,第一个放入的东西就在杯子最后一层,第二个放入的东西就在倒数第二层,现在我们要取出最后一层的东西,就必须先把第二层的东西给出来。
函数栈:栈里面每一层都是装的都是函数的栈就是函数栈,调用一个函数的时候,这个函数就入栈,这个函数调用完成了(执行到了函数的最后一个语句或者说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数列的更多相关文章
- SpringBoot系列教程JPA之query使用姿势详解之基础篇
		
前面的几篇文章分别介绍了CURD中的增删改,接下来进入最最常见的查询篇,看一下使用jpa进行db的记录查询时,可以怎么玩 本篇将介绍一些基础的查询使用姿势,主要包括根据字段查询,and/or/in/l ...
 - hadoop之mapreduce详解(基础篇)
		
本篇文章主要从mapreduce运行作业的过程,shuffle,以及mapreduce作业失败的容错几个方面进行详解. 一.mapreduce作业运行过程 1.1.mapreduce介绍 MapRed ...
 - 最简单MySQL教程详解(基础篇)之多表联合查询
		
在关系型数据库中,我们通常为了减少数据的冗余量将对数据表进行规范,将数据分割到不同的表中.当我们需要将这些数据重新合成一条时,就需要用到我们介绍来将要说到的表连接. 常用术语冗余(Redundancy ...
 - hadoop之mapreduce详解(进阶篇)
		
上篇文章hadoop之mapreduce详解(基础篇)我们了解了mapreduce的执行过程和shuffle过程,本篇文章主要从mapreduce的组件和输入输出方面进行阐述. 一.mapreduce ...
 - TCP协议详解(理论篇)
		
TCP协议详解(理论篇) 2012-08-20 0个评论 作者:陈立龙 收藏 我要投稿 TCP协议详解(理论篇) 1. 与UDP不同的是,TCP提供了一种面向连接 ...
 - 第7.25节 Python案例详解:使用property函数定义与实例变量同名的属性会怎样?
		
第7.25节 Python案例详解:使用property函数定义与实例变量同名的属性会怎样? 一. 案例说明 我们上节提到了,使用property函数定义的属性不要与类内已经定义的普通实例变量重 ...
 - IIS负载均衡-Application Request Route详解第四篇:使用ARR实现三层部署架构(转载)
		
IIS负载均衡-Application Request Route详解第四篇:使用ARR实现三层部署架构 系列文章链接: IIS负载均衡-Application Request Route详解第一篇: ...
 - [转]ANDROID L——Material Design详解(动画篇)
		
转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 转自:http://blog.csdn.net/a396901990/article/de ...
 - appledoc导出iOS代码文档的使用和问题详解(干货篇)
		
appledoc导出iOS代码文档的使用和问题详解(干货篇) 1. 简单说一下背景和自己感受 背景: 项目好像突然黄了,公司让详细写项目代码的注释并且导出文档,弄完之后就要封版. 说实话:听到这个消息 ...
 - Android为TV端助力 转载:Android绘图Canvas十八般武器之Shader详解及实战篇(上)
		
前言 Android中绘图离不开的就是Canvas了,Canvas是一个庞大的知识体系,有Java层的,也有jni层深入到Framework.Canvas有许多的知识内容,构建了一个武器库一般,所谓十 ...
 
随机推荐
- Paddle Inference推理部署
			
Paddle Inference推理部署 飞桨(PaddlePaddle)是集深度学习核心框架.工具组件和服务平台为一体的技术先进.功能完备的开源深度学习平台,已被中国企业广泛使用,深度契合企业应用需 ...
 - AI算子列表
			
AI算子列表 概述 目前只有部分算子可在一个库中同时运行在MLU220和MLU270平台.也就是用户使用 ./build_cnplugin.sh --mlu270 命令编译生成的 libcnplugi ...
 - Relay外部库使用
			
Relay外部库使用 本文介绍如何将cuDNN或cuBLAS等外部库与Relay一起使用. Relay内部使用TVM生成目标特定的代码.例如,使用cuda后端,TVM为用户提供的网络中的所有层生成cu ...
 - 3D Cube计算引擎加速运算
			
3D Cube计算引擎加速运算 华为达芬奇架构的AI芯片Ascend910,同时与之配套的新一代AI开源计算框架MindSpore. 为什么要做达芬奇架构? AI将作为一项通用技术极大地提高生产力,改 ...
 - 负载均衡算法: 简单轮询算法, 平滑加权轮询, 一致性hash算法,  随机轮询, 加权随机轮询, 最小活跃数算法(基于dubbo) java代码实现
			
直接上干活 /** * @version 1.0.0 * @@menu <p> * @date 2020/11/17 16:28 */ public class LoadBlance { ...
 - 【Java面试真题】剑指Offer53.2——0~n-1中缺失的数字(异或、二分两种解法)
			
[Java实现]剑指Offer53.2--0~n-1中缺失的数字:面试真题,两种思路分享 前面有另一道面试题[Java实现]剑指offer53.1--在排序数组中查找数字(LeetCode34:在排序 ...
 - 狂神说redis笔记(四)
			
十二.Redis主从复制 概念 主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器.前者称为主节点(Master/Leader),后者称为从节点(Slave/Follower), ...
 - NCF WebApi中 Controller的全解析
			
简介 上一篇我们说了如何实现一个WebApi,并运行起来 这次我们来说说WebApi的内在,我们到底做了哪些事情 仓库地址:https://github.com/NeuCharFramework/NC ...
 - 「题解」POI2005 AKC-Special Forces Manoeuvres
			
本文将同步发布于: 洛谷博客: csdn: 博客园: 简书. 题目 题目链接:洛谷 P3428.官网. 题意简述 给定 \(n\) 个圆 \((x_i,y_i,r_i)\),每个圆对应一个点集 \(S ...
 - 二、Linux基本防护措施
			
修改账户有效期 chage命令的语法格式: chage –l 账户名称 //查看账户信息 chage –E 时间 账户名称 ...