Ich implementiere ein rekursives Programm, um die bestimmten Werte in der Schroder-Sequenz zu berechnen, und ich habe zwei Probleme:
Hier ist der Code:
let rec schroder n =
if n <= 0 then 1
else if n = 1 then 2
else 3 * schroder (n-1) + sum n 1
and sum n k =
if (k > n-2) then 0
else schroder k * schroder (n-k-1) + sum n (k+1)
Wenn ich versuche, Tupel ( 1. ) zurückzugeben, funktioniert die Funktion sum
nicht mehr, weil sie versucht, zurückzugeben, int
wenn sie type hat int * int
; Bezüglich 2., wenn ich es tue schroder 15
, kehrt es zurück:
-357364258
wenn es zurückkehren sollte
3937603038
.
Lösung des Problems
Ich muss die Anzahl der Aufrufe im Programm berechnen;... die Funktion 'sum' funktioniert nicht mehr, weil sie versucht, 'int' zurückzugeben, wenn sie den Typ 'int * int' hat
Stellen Sie sicher, dass Sie alle rekursiven Aufrufe auf aktualisiert haben shroder
. Denken Sie daran, dass jetzt ein Paar und keine Zahl zurückgegeben wird, sodass Sie es beispielsweise nicht einfach hinzufügen können und das Paar zuerst entpacken müssen. Z.B,
...
else
let r,i = schroder (n-1) (i+1) in
3 * r + sum n 1 and...
und so weiter.
Ab einer bestimmten Zahl generiert das Programm falsche Werte (ich denke, das liegt daran, dass die Zahl zu groß ist);
Sie müssen Zahlen mit beliebiger Genauigkeit verwenden, z. B. zarith
Keine Kommentare:
Kommentar veröffentlichen