假设我有一个基本的递归函数:
function recur(data) {
data = data+1;
var nothing = function() {
recur(data);
}
nothing();
}
Run Code Online (Sandbox Code Playgroud)
如果我有匿名功能,我怎么能这样做...
(function(data){
data = data+1;
var nothing = function() {
//Something here that calls the function?
}
nothing();
})();
Run Code Online (Sandbox Code Playgroud)
我想要一种方法来调用调用这个函数的函数...我已经看到某个地方的脚本(我记不清哪里)可以告诉你一个被调用的函数的名字,但我记不起任何一个那个信息现在.
我无法理解Y-combinator,所以我尝试实现一个在没有本机实现的情况下启用递归的函数.经过一番思考,我最终得到了这个:
Y = ?x.(?v.(x x) v)
Run Code Online (Sandbox Code Playgroud)
哪个比实际的短:
Y = ?f.(?x.f (x x)) (?x.f (x x))
Run Code Online (Sandbox Code Playgroud)
而且,令我惊讶的是,工作.一些例子:
// JavaScript
Y = function(x){
return function(v){
return x(x, v);
};
};
sum = Y(function(f, n){
return n == 0 ? 0 : n + f(f, n - 1);
});
sum(4);
; Scheme
(define Y (lambda (x) (lambda (v) (x x v))))
(define sum (Y
(lambda (f n)
(if (equal? n 0)
0
(+ n (f f (- n 1)))))))
(sum 4)
Run Code Online (Sandbox Code Playgroud)
两个片段按预期输出10(从0到4的总和).
这是什么,为什么它更短,为什么我们更喜欢更长的版本?
javascript recursion scheme functional-programming y-combinator
一个正常的自调用函数如下所示:
(function () {
// Something.
})();
Run Code Online (Sandbox Code Playgroud)
但是,函数可以以某种方式以递归方式调用自身,如下所示:
(function f(i, num) {
if (num > 0) {
console.log(i);
f(i + 1, num - 1);
}
})(0, 2);
Run Code Online (Sandbox Code Playgroud)
但仍然保持匿名?
ES6箭头功能可以自行调用吗?
(a => {
// Somehow invoke itself.
})();
Run Code Online (Sandbox Code Playgroud)