NodeJS in LNNM程序员

迎接ECMAScript 6, 使用尾递归

2014-11-24  本文已影响1896人  Tulayang

尾调用,是指函数内部的最后一个动作是函数调用。该调用的返回值,直接返回给函数。

Example:

function sum(x) {
    return sum(x + 1);
}

这里的sum()内部的sum就是属于尾调用,ta所返回的值直接返回给调用ta的上层sum()函数。

function sum(x) {
    return 1 + sum(x + 1);
}

这里的sum()内部的sum就不属于尾调用,ta所返回的值在返回给调用ta的上层sum()函数之前,需要先跟1计算和,然后再返回。

尾调用和非尾调用有什么差异?

编写一个求和函数,有大致3种方式:

使用尾递归

这里有一个使用尾递归提取绝对文件名的例子,可以来展示下尾递归的魅力。这个函数需要输入一个(或几个)目录名和当前所在的文件位置,然后会递归提取目录下的所有文件名,放入一个栈中。

var FS = require('fs');
var PATH = require('path');

function readSync(paths, i) {
    if (i >= 0 && i < paths.length) {
        var stats = FS.statSync(paths[i]);
        if (stats.isFile()) {
            return readSync(paths, ++i);
        } else if (stats.isDirectory()) {
            var newPaths = FS.readdirSync(paths[i]).map(function (path) {
                return PATH.join(paths[i],path);
            });
            return readSync(paths.slice(0, i).concat(newPaths, 
                                                     paths.slice(i + 1)), 
                            i);
        } else {
            return readSync(paths.slice(0, i).concat(paths.slice(i + 1)), 
                            i);
        }
    } else {
        return paths;
    }
}

测试一下,这个函数可以在服务器启动时,提取某一个(或者几个)目录内的所有文件,然后用于编译或者是其他的操作。

readSync([PATH.join(__dirname, './tpls')], 0).forEach(function (path) {
    console.log(path);
});
readSync([PATH.join(__dirname, './tpls'), PATH.join(__dirname, './pages')], 0).forEach(function (path) {
    console.log(path);
});
上一篇 下一篇

猜你喜欢

热点阅读