1unitedpower: Informatik zum Donnerstag

Beitrag lesen

Das liegt vermutlich an der schlechten Implementierung von natE - also mein Fehler. Ich hätte natE tail-rekursiv schreiben können, dann würde der Stack überhaupt nicht wachsen. Mal sehen, ob ich das noch hinbekomme.

Die tail-rekursive Variante muss noch warten, aber ich habe in der Zwischenzeit eine iterative Variante entwickelt, die das Problem umschifft.

function natE<a>(base: a, step: ((x:a) => a), n:Nat) : a {
  let acc = base;
  let i = n;
  while (i instanceof Succ) {
    acc = step(acc);
    i = i.pred;
  }
  return acc;
}

Dabei hat sich dann herausgestellt, dass from mitverantwortlich für den Fehler ist.

function from (n:Nat) : number {
  const base = 0;
  const step = (x:number) => x+1;
  return natE<number>(base, step, n);
}

Mit diesen beiden Definitionen wächst der Callstack jetzt nicht mehr an. In der Vorlage lasse ich aber die alten Definitionen stehen, ich glaube die sind etwas intuitiver. Und in der Aufgabe geht es schließlich auch im Rekursion.