2014-12-14 2 views
1

Услышь мой код. Мне нужно выполнить эту работу, не используя имя функции. Хотя функции нельзя назвать, они могут передаваться как параметры в другую функцию.Выполнение рекурсии по анонимной функции

И я не хочу использовать arguments.callee.

Может ли кто-нибудь мне помочь.

На самом деле это моя задача. что мне нужно сделать рекурсию в анонимной функции. и я не могу использовать любое имя функции. но я могу передать имя функции в качестве параметра другой функции. Есть ли способ заменить arguments.callee.

var n=5; // The result should be 15 
    console.log((function sum(n) { 
     if (n ==0) 
     return n; 
     else 
     return n + sum(n-1); 
    })(n)); 
+2

Именование функции является правильный способ сделать это, почему бы вам не назвать его? В противном случае, как упражнение, рассмотрите использование комбинатора Y. – elclanrs

+2

Это может помочь, если вы добавите какое-то объяснение относительно * почему * вы не хотите, чтобы функция называлась именем. – Pointy

+0

На самом деле это моя задача. что мне нужно сделать рекурсию в анонимной функции. и я не могу использовать любое имя функции. но я могу передать имя функции в качестве параметра другой функции. –

ответ

3

Вы можете обернуть код в анонимную функцию, в нем можно объявить с именем функции:

console.log((function(n){ 

    function fib(n) { 
    if (n == 0) { 
     return n; 
    } else { 
     return n + fib(n - 1); 
    } 
    } 

    return fib(n); 

})(n)); 

Если вы хотите сделать это полностью без названных функций, только установив имя функции, передав ее в качестве параметра, то вам необходимо отправить ссылку на функцию в каждом вызове:

console.log((function(f, n){ 

    return f(f, n); 

})(function(f, n) { 
    if (n == 0) { 
    return n; 
    } else { 
    return n + f(f, n - 1); 
    } 
}, n)); 
0

Единственное, что у вас есть, это сохранить функцию в переменной.

var fib = function(n) { ... }; 

Так или иначе вы должны ссылаться на эту функцию. Если это не имя, и вы не используете arguments.callee, тогда вы должны сохранить ссылку в переменной.

+0

Есть ли что-то новое, что заменяет arguments.callee .. Как его устарело. –

1

Вы можете использовать U-комбинатор:

const U = f => f(f); 
const sum = n => n === 0 ? n : n + sum(n - 1); 
const sum_ = U(h => n => n === 0 ? n : n + h(h)(n - 1)); 

sum(5); // 15 
sum_(5); // 15 

Обратите внимание, как прошло лямбда (анонимная функция) должен быть адаптирован для того, чтобы работать с U:

 n => n === 0 ? 1 : n + sum (n - 1) // named 
h => n => n === 0 ? 1 : n + h(h)(n - 1) // anonymous 
Смежные вопросы