ich das vielleicht nicht ein einfacher Ansatz wissen Referenz factorial passieren, aber ich über eine Technik gelernt "fix" von funktionalen Sprachen genannt. Die fix
Funktion von Haskell ist allgemeiner bekannt als die Y combinator, die eine der bekanntesten fixed point combinators ist.
ein Fixpunkt ist ein Wert, der durch eine Funktion unverändert ist: ein fester Punkt einer Funktion f ist jedes x, so daß x = f (x). Ein Festkomma-Kombinator y ist eine Funktion, die einen festen Punkt für jede Funktion f zurückgibt. Da y (f) ein fester Punkt von f ist, haben wir y (f) = f (y (f)).
Im Wesentlichen erstellt der Y-Kombinator eine neue Funktion, die alle Argumente des Originals übernimmt, plus ein zusätzliches Argument, das die rekursive Funktion ist. Wie das funktioniert, ist in der Curry-Notation offensichtlich. Anstatt Argumente in Klammern zu schreiben (f(x,y,...)
), schreiben Sie sie nach der Funktion: f x y ...
. Der Y-Kombinator ist definiert als Y f = f (Y f)
; oder, mit einem einzigen Argument für die rekursive Funktion, Y f x = f (Y f) x
.
Da PHP nicht automatisch curry funktioniert, ist es ein bisschen ein Hack zu machen fix
Arbeit, aber ich denke, es ist interessant.
function fix($func)
{
return function() use ($func)
{
$args = func_get_args();
array_unshift($args, fix($func));
return call_user_func_array($func, $args);
};
}
$factorial = function($func, $n) {
if ($n == 1) return 1;
return $func($n - 1) * $n;
};
$factorial = fix($factorial);
print $factorial(5);
Hinweis: Dies ist fast das gleiche wie die einfachen Verschlusslösungen andere Beiträge geschrieben haben, aber die Funktion fix
schafft die Schließung für Sie. Festkomma-Kombinatoren sind etwas komplexer als die Verwendung eines Verschlusses, sind jedoch allgemeiner und haben andere Verwendungen. Während die Closure-Methode eher für PHP geeignet ist (was keine ausgesprochen funktionale Sprache ist), ist das ursprüngliche Problem eher eine Übung als für die Produktion, daher ist der Y-Kombinator ein praktikabler Ansatz.
Ich habe kein PHP 5.3.0 zu überprüfen, aber haben Sie versucht, 'global $ factorial' zu verwenden? – kennytm
* (sidenote) * Ein Lamba ist eine anonyme Funktion, während das obige eine Closure ist. – Gordon
Lambdas und Closures schließen sich nicht gegenseitig aus. In der Tat glauben einige Leute, dass eine Schließung Lambda sein muss, damit es eine Schließung ist (anonyme Funktion). Zum Beispiel Python muss man der Funktion zuerst einen Namen geben (abhängig von der Version).Weil Sie ihm einen Namen geben müssen, können Sie nicht inline und einige würden sagen, dass es eine Schließung zu disqualifizieren. –