Es gibt auch den LISP Sinn von ‚Trampolin‘, wie auf Wikipedia beschrieben:
in einigen LISP-Implementierungen, ein Trampolin ist eine Schleife, die iterativ aufrufen thunk-Rückkehr Funktionen. Ein einzelnes Trampolin reicht aus, um alle Steuerübertragungen eines Programms auszudrücken; ein so ausgedrücktes Programm ist Trampolin oder im "Trampolin-Stil"; Umwandlung eines Programms in Trampolin Stil ist Trampolinspringen. Trampolined Funktionen können verwendet werden, Schwanz rekursive Funktion ruft in stapelorientierten Sprachen
uns zu implementieren Lassen Sie sagen, wir Javascript verwenden und wollen die naive Fibonacci-Funktion in Weiter-passing-Stil schreiben. Der Grund, warum wir das tun würden, ist nicht relevant - beispielsweise, um Scheme nach JS zu portieren oder um mit CPS zu spielen, das wir sowieso verwenden müssen, um serverseitige Funktionen aufzurufen.
So, der erste Versuch ist
function fibcps(n, c) {
if (n <= 1) {
c(n);
} else {
fibcps(n - 1, function (x) {
fibcps(n - 2, function (y) {
c(x + y)
})
});
}
}
Aber läuft dies mit n = 25
in Firefox einen Fehler gibt 'Rekursion zu viel!'. Nun ist das genau das Problem (fehlende Tail-Call-Optimierung in Javascript) das Trampolining löst. Anstatt einen (rekursiven) Aufruf an eine Funktion zu machen, lassen Sie uns return
eine Anweisung (Thunk), um diese Funktion aufzurufen, in einer Schleife zu interpretieren.
function fibt(n, c) {
function trampoline(x) {
while (x && x.func) {
x = x.func.apply(null, x.args);
}
}
function fibtramp(n, c) {
if (n <= 1) {
return {func: c, args: [n]};
} else {
return {
func: fibtramp,
args: [n - 1,
function (x) {
return {
func: fibtramp,
args: [n - 2, function (y) {
return {func: c, args: [x + y]}
}]
}
}
]
}
}
}
trampoline({func: fibtramp, args: [n, c]});
}
[Verwandte] (http://stackoverflow.com/questions/2420346/c-api -funktion-callbacks-in-c-member-function-code) – bobobobo
Es ist die verallgemeinerte Form einiger Funktionen, die man mit setjmp/lomgjmp implementieren könnte, nämlich Stack-Overwflow zu vermeiden. – Ingo
Warum sollte jemand Stackoverflow vermeiden wollen? – Mangostaniko