Heim > Artikel > Web-Frontend > Einführung in die Verwendung rekursiver Funktionen in js
Versuchen wir es mit einer Fakultät innerhalb von 10:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>js中递归函数的使用</title> <script type="text/javascript"> function f(num){ if(num<1){ return 1; }else{ return f(num-1)*num; } } </script> </head> <body> <script type="text/javascript"> alert("10!的结果为:"+f(10)); </script> </body> </html>
Das ist alles für den Aufruf rekursiver Funktionen
Die Versicherungsmethode, wenn sich rekursive js-Funktionen selbst aufrufen.
Aus der erweiterten js-Programmierung
Eine typische faktorielle rekursive Funktion:
function fact(num){ if (num<=1){ return 1; }else{ return num*fact(num-1); } }
Der folgende Code kann einen Fehler verursachen:
var anotherFact = fact
fact = null ;
alert(antherFact(4)); //Fehler
Da fact keine Funktion mehr ist, ist ein Fehler aufgetreten.
Das Problem kann mit arguments.callee gelöst werden, das ein Zeiger auf die ausgeführte Funktion ist.
Die neue Funktion ist:
function fact(num){ if (num<=1){ return 1; }else{ return num*arguments.callee(num-1); //此处更改了。 } } var anotherFact = fact; fact = null; alert(antherFact(4)); //结果为24.
Verbesserungen der gewöhnlichen JS-Rekursion
Rekursive Funktionen werden gebildet, wenn eine Funktion sich selbst über ihren Namen aufruft, wie unten gezeigt:
function factorial(num) { if(num<=1) { return 1; } else { return num * factorial(num-1); } }
Dies ist eine klassische Fakultätsfunktion. Oberflächlich betrachtet scheint es kein Problem zu geben, aber der folgende Code kann dazu führen, dass es schief geht.
var anotherFactory = Faculty;
anotherFactorial(4); //output 24
factorial = null;
(4); //TypeError: Die Eigenschaft „Fakultät“ des Objekts [Objektfenster] ist kein
Testen Sie unter Funktion chrome
Der Grund dafür ist, dass der von uns definierte Funktionsname tatsächlich ein Zeiger auf die Funktion ist und zu diesem Zeitpunkt ein andererFactorial definiert ist
Es zeigt auch auf diese Funktion, sodass der Aufruf von anotherFactory (4) erfolgreich 24 ausgeben kann
Zu diesem Zeitpunkt factial = null;
Dann ist der Verweis auf die Ausführungsdefinitionsfunktion anotherFactorial, und die obige Fehlermeldung wird beim Aufruf von anotherFactorial(4) angezeigt.
Zu diesem Zeitpunkt können Sie arguments.callee verwenden, um die Funktion in der Funktionsdefinition zu ersetzen.
Die Definition der Funktion lautet:
function factorial(num) { if(num<=1) { return 1; } else { return num * arguments.callee(num-1); } }Verwenden Sie dann die oben genannten 4 Zeilen Testcode. die letzte Zeile Der Testcode kann auch 24 erfolgreich ausgeben.