资讯专栏INFORMATION COLUMN

递归函数的执行

tomato / 2753人阅读

摘要:递归一个函数可以指向并调用自身。这是的一个独特的用法,在这个结构下无法替代,出错但我们可以用下面这种方式,把递归函数赋值给一个变量

递归(Recursion)

一个函数可以指向并调用自身(call itself)。有三种方法可以达到这个目的:

函数名

arguments.callee

作用域下的一个指向该函数的变量名

上述概念引用自MDN,对递归概念不清楚的可以自行查看;

递归函数的执行

在这里我们讨论一下递归函数中递归后的语句如何执行,先看这样一个例子:

function rec(x){
if(x!==1){
   console.log(x)
   rec(x-1)
   console.log(x) 
   }   
}
rec(5) //输出为5 4 3 2 2 3 4 5

以上这段代码执行的结果就是递归前的语句顺序执行,递归后的语句倒序执行。初看到这段代码,完全不能理解它执行的顺序。通过调试让代码逐行执行,可以看到执行的顺序,其实就是一层一层执行递归,每执行到rec(x-1)时就重新执行该函数,递归后的语句会在递归执行到最里层后再由内向外输出。
CSDN上的一篇博客很好的总结了递归的特性如下:
1 每一次函数调用都会有一次返回.当程序流执行到某一级递归的结尾处时,它会转移到前一级递归紧接着的后面继续执行.
2 递归函数中,位于递归调用前的语句和各级被调函数具有相同的顺序.如打印语句 #1 位于递归调用语句前,它按照递归调用的顺序被执行了 4 次.
3 每一级的函数调用都有自己的私有变量.
4 递归函数中,位于递归调用语句后的语句的执行顺序和各个被调用函数的顺序相反.
5 虽然每一级递归有自己的变量,但是函数代码并不会得到复制.
6 递归函数中必须包含可以终止递归调用的语句.

在这个例子中,终止递归调用的条件是if(x!==1),如果调用时取值x小于1,会构成死循环;这个例子中的递归采用了通过函数名调用的方法。
下面我们再讨论一下argumengts.callee方式,在ES5严格模式下,callee是无法使用的,原因详见MDN中arguments.callee。

这是callee的一个独特的用法,在这个结构下无法替代,

function factorial(num){
    if (num <= 1){
        return 1;
    } else {
        return num * factorial(num-1);
    }
}
var anotherFactorial = factorial;
alert(anotherFactorial(4)); //出错!

但我们可以用下面这种方式,把递归函数赋值给一个变量:

var factorial = (function f(num){
if (num <= 1){
return 1;
} else {
return num * f(num-1);
}
});

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/86925.html

相关文章

  • 翻译连载 | 第 9 章:递归(下)-《JavaScript轻量级函数式编程》 |《你不知道JS》

    摘要:每个函数调用都将开辟出一小块称为堆栈帧的内存。当第二个函数开始执行,堆栈帧增加到个。当这个函数调用结束后,它的帧会从堆栈中退出。保持堆栈帧跟踪函数调用的状态,并将其分派给下一个递归调用迭。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTM...

    LeviDing 评论0 收藏0
  • JavaScript专题之递归

    摘要:专题系列第十八篇,讲解递归和尾递归定义程序调用自身的编程技巧称为递归。然而非尾调用函数,就会创建多个执行上下文压入执行上下文栈。所以我们只用把阶乘函数改造成一个尾递归形式,就可以避免创建那么多的执行上下文。 JavaScript 专题系列第十八篇,讲解递归和尾递归 定义 程序调用自身的编程技巧称为递归(recursion)。 阶乘 以阶乘为例: function factorial(n...

    asoren 评论0 收藏0
  • 最大子序列求解-分治方法

    摘要:下面进行简单的作图分析注意到,递归函数从外层,沿着计算的路径,经过三次递归调用函数,到达基准,在基准层分别计算递归函数内部的三部分左侧最大子序列与右侧最大子序列的和,并利用求出最大者返回。 问题描述 问题:给定整数序列,求解其中最大子序列(连续的序列)。 思路分析 利用分治和递归的思想求解,在《数据结构与算法分析(Java语言描述)》Page29,作者给出了具体的java代码。...

    microelec 评论0 收藏0
  • 【从蛋壳到满天飞】JAVA 数据结构解析和算法实现-链表与递归

    摘要:链表与递归已经从底层完整实现了一个单链表这样的数据结构,并且也依托链表这样的数据结构实现了栈和队列,在实现队列的时候对链表进行了一些改进。计算这个区间内的所有数字之和。 showImg(https://segmentfault.com/img/remote/1460000018597053?w=1832&h=9943); 前言 【从蛋壳到满天飞】JAVA 数据结构解析和算法实现,全部文...

    lastSeries 评论0 收藏0
  • 【从蛋壳到满天飞】JAVA 数据结构解析和算法实现-链表与递归

    摘要:链表与递归已经从底层完整实现了一个单链表这样的数据结构,并且也依托链表这样的数据结构实现了栈和队列,在实现队列的时候对链表进行了一些改进。计算这个区间内的所有数字之和。 showImg(https://segmentfault.com/img/remote/1460000018597053?w=1832&h=9943); 前言 【从蛋壳到满天飞】JAVA 数据结构解析和算法实现,全部文...

    alanoddsoff 评论0 收藏0

发表评论

0条评论

tomato

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<