匿名,递归,lambda

先让我热热身,写一个递归的函数是来计算n的阶乘.不出意外,它应该是这个样子:
function factorial (n) {
    if (n == 1) {
        return 1;
    } else {
        return n * factorial(n - 1);
    }
}
这也太简单了吧,我要增加一点难度,只准使用匿名函数.
哼哼,so easy.
function (n) {
    if (n == 1) {
        return 1;
    } else {
        return n * this(n - 1);
    }
}
然后我就想,如果不使用 this 关键字,有没办法呢?我眉头一皱

匿名,递归,lambda_第1张图片

但俗话说的好,再狡猾的猎人也斗不过一只好狐狸啊!我略一思索,不肖片刻便行云流水般写下如下代码:
(function(n,factorial) { //求n的阶乘 n = 5

    if (n == 1) {
        return 1;
    } else {
        return n * factorial(n - 1, factorial);
    }

})(5,function(n,factorial) {

    if (n == 1) {
        return 1;
    } else {
        return n * factorial(n - 1, factorial);
    }

})
站在公司新发的工程学座椅上,品一口82年的java

匿名,递归,lambda_第2张图片

随后志得意满的对旁边工位的jack说,"jack,你看我这一手js代码写    得如何啊?"
jack连眼皮都没抬一下,只轻轻说了句"这么丑的代码也好意思拿出来   给别 人看?",然后就继续睡觉了.
我刚想反驳,却突然觉得这家伙说的好有道理啊(⊙o⊙)!
在敲坏37个回车键之后,我终于写出了如下代码

匿名,递归,lambda_第3张图片

(function(n,factorial) { //求n的阶乘 n = 5

    return factorial(n, factorial);
    
})(5,function(n,factorial) {

    if (n == 1) {
        return 1;
    } else {
        return n * factorial(n - 1, factorial);
    }

})
又报废了两个回车键

匿名,递归,lambda_第4张图片

(function (n) {
    return (function(n,factorial) {
        
            return factorial(n,factorial);

    })(n ,function(n,factorial) {

        if (n == 1) {
            return 1;
        } else {
            return n * factorial(n - 1, factorial);
        }

    })
})(5)
这时恰逢cto路过!

匿名,递归,lambda_第5张图片

于是

匿名,递归,lambda_第6张图片

(function (requireRecFun) {//将需要递归的函数传进去即可.
    return function (n){return requireRecFun(n,requireRecFun)};
})(function(n,factorial) {
    if (n == 1) {
        return 1;
    } else {
        return n * factorial(n - 1,factorial);
    }
})(5)

匿名,递归,lambda_第7张图片

你可能感兴趣的:(lambda)