• 递归、尾递归


    为了理解递归,则必须首先理解递归。

    所谓递归,就是函数调用自身的一种方法。

    要理解递归,首先要引入栈的概念。栈是一种数据结构。

    简单的说,栈是存储数据的数据块,允许数据先进先出,类似于枪的弹匣。

    栈用来存放递归过程中产生的中间数据。如果有判断条件,直到栈中的数据全部出栈递归完成;否则栈的空间会一直增加,递归也会一直进行。

    为了避免这种现象,有时候我们要的结果是递归完后的结果,我们引入尾递归。

    所谓的尾递归,是递归的一种特例。

    是指把把递归的结果当成递归的参数,传给下一个递归。

    这样一来之前的栈中的参数就没效果了,所以如果编译器对此进行优化的话,按照道理尾递归就永远不可能溢出。

    下面来看下例子:

    打印1-1000这1000个数, 不许使用循环语句/条件语句,不许使用?:运算符。

    //1,递归

    int print(int i)

    {

    printf("%d\n",i++);

    assert(i-1001);//或者用任何一种异常退出程序,比如除法 int t=1/(i-1000)

    print(i);

    }

    //2,尾递归

    int print(int i)

    {

    return (1000-i++)&&print(i);//利用尾递归就不用用异常法退出递归了。

    }

  • 相关阅读:
    html5阴影
    html5绘制字符串
    HTML5绘制几何图形
    Animation同时改变多个属性的动画
    Animation鱼眼效果
    Animation动画
    IE6中CSS常见BUG全集及解决方案——摘自网友
    transition多个属性同时渐变(width,height,background)
    【BZOJ2049】 [Sdoi2008]Cave 洞穴勘测
    【CF995F】 Cowmpany Cowmpensation
  • 原文地址:https://www.cnblogs.com/273809717/p/2831192.html
Copyright © 2020-2023  润新知