什么是递归函数?

FlyWine2018-02-21 09:42:10

44910

收藏 120

分类专栏:C++文章标签:递归函数c++递归函数什么是递归
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
版权
  • 递归函数

    • 递归

    • 例题

    • 特点

    • 效率

    • 优点

递归函数

递归

递归就是一个函数在它的函数体内调用它自身。执行递归函数将反复调用其自身,每调用一次就进入新的一层。递归函数必须有结束条件
当函数在一直递推,直到遇到墙后返回,这个墙就是结束条件
所以递归要有两个要素,结束条件与递推关系

注:

递归的时候,每次调用一个函数,计算机都会为这个函数分配新的空间,这就是说,当被调函数返回的时候,调用函数中的变量依然会保持原先的值,否则也不可能实现反向输出。

例题

  1. 计算n的阶乘

#include <stdio.h> int factorial(int n){    int result;    if (n<0)                                          //判断例外    {        printf("输入错误!\n");        return 0;    }     else if (n==0 || n==1)    {        result = 1;  //回推墙    }    else    {        result = factorial(n-1) * n;  //递推关系,这个数与上一个数之间的关系。    }    return result;}int main(){    int n = 5;                                              //输入数字5,计算5的阶乘    printf("%d的阶乘=%d",n,factorial(n));    return 0;}

程序在计算5的阶乘的时候,先执行递推,当n=1或者n=0的时候返回1,再回推将计算并返回。由此可以看出递归函数必须有结束条件

  1. 斐波那契数列

斐波那契数列指的是这样一个数列:

0, 1, 1, 2, 3, 5, 8, 13, 21, ···

这个数列从第三项开始,每一项都等于前两项之和.

#include <stdio.h>long fibonacci( long num ){    if ( num == 0 || num == 1 )    {        return num;    }    else    {        return fibonacci( num -1 ) + fibonacci( num -2 );    }}void mian(){    long number;    puts("请输入一个正整数: ");    scanf("%ld", &number);    printf("斐波那契数列第%ld项为: %ld\n", number, fibonacci( number ) );}
  1. 应用题~~

小明为了学好英语,需要每天记单词,第一天记1个,第二天记2个依次类推,请用代码完成,算出小明第10天开始的时候会了多少个单词?

分析:
墙(结束条件)是“第一天记1个”
递推关系是“第n天记的单词= 第n-1天记的单词数量+n”

#include <stdio.h>/* 定义获取单词数量的函数 */int getWordNumber(n){       if(n == 1)    {        return 1;    //回推墙    }    else{        return getWordNumber(n-1)+n ;       //递推关系    }}int main(){    int num = getWordNumber(10);     //获取会了的单词数量    printf("小明第10天记了:%d个单词。\n", num);    return 0;}

特点

递归函数特点:

1. 每一级函数调用时都有自己的变量,但是函数代码并不会得到复制,如计算5的阶乘时每递推一次变量都不同;2. 每次调用都会有一次返回,如计算5的阶乘时每递推一次都返回进行下一次;3. 递归函数中,位于递归调用前的语句和各级被调用函数具有相同的执行顺序;4. 递归函数中,位于递归调用后的语句的执行顺序和各个被调用函数的顺序相反;5. 递归函数中必须有终止语句。

一句话总结递归:自我调用且有完成状态。

效率

  1. 系统栈(也叫核心栈、内核栈)
    是内存中属于操作系统空间的一块区域,其主要用途为: (1)保存中断现场,对于嵌套中断,被中断程序的现场信息依次压入系统栈,中断返回时逆序弹出; (2)保存操作系统子程序间相互调用的参数、返回值、返回点以及子程序(函数)的局部变量。

  2. 用户栈
    是用户进程空间中的一块区域,用于保存用户进程的子程序间相互调用的参数、返回值、返回点以及子程序(函数)的局部变量。
    我们编写的递归程序属于用户程序,因此使用的是用户栈。

  3. 栈溢出
    函数调用的参数是通过栈空间来传递的,在调用过程中会占用线程的栈资源。而递归调用,只有走到最后的结束点后函数才能依次退出,而未到达最后的结束点之前,占用的栈空间一直没有释放,如果递归调用次数过多,就可能导致占用的栈资源超过线程的最大值,从而导致栈溢出,导致程序的异常退出。

综上:

函数调用的时候,每次调用时要做地址保存,参数传递等,这是通过一个递归工作栈实现的。具体是每次调用函数本身要保存的内容包括:局部变量、形参、调用函数地址、返回值。那么,如果递归调用N次,就要分配N次局部变量、N次形参、N次调用函数地址、N次返回值,势必效率低.

优点

  1. 代码简洁、清晰,易懂

==循环能干的事,递归都能干;递归能干的循环不一定能干==

对于我们,能用循环解决的,尽量不适用递归.

(0)

相关推荐

  • 递归函数

    递归函数

  • 万字长文,佩奇算法八大思想!

    零.前言 大家好,我是小浩. 分享一篇由读者 @Kevin_涛 写的算法思想文章: 在讲解八大算法思想之前我想先简述以下三个问题,以便大家更好的理解算法. 1. 什么是算法? <算法导论> ...

  • 零基础学Python:函数精讲

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 1. 位置参数与关键字参数 尽管这种方式很常见,但是位置参数的一个弊端是必须熟记每个位置的参 ...

  • 什么是递归函数呢?区间套的使用

    释放双眼,带上耳机,听听看~! 00:00 00:00 缠论之所以伟大,在于其发现了金融市场一个吻合于自然.社会等复杂系统普适的描述性的几何模型,即通过自同构性结构的自组和级别间的扩展自组递归函数.而 ...

  • 【视频更新】第四十四集 C语言程序的内存分配和递归函数

    介绍了C语言中的内存分配和递归函数

  • 【连载】(堆栈和递归函数)乐创DIY C语言讲义——4.5节

    4.5 堆栈和递归函数 堆栈这个概念,最早学习微机原理的时候就学过,它表示的是一种在汇编语言调用子程序时候保存现场的存储空间,它所具有的数据结构属性就是先进后出,这个是我们之前学习计算机硬件时候讲述的 ...

  • Python|递归函数之斐波那契数列

    上一期小编主要针对def函数的运用进行了简单的讲解,本期将会深入探讨def函数的另一种特别有用的函数(递归函数),其定义:如果一个函数在内部调自身,这个函数就是递归函数,递归函数的优点在于其定义简单, ...