ML (שפת תכנות) – הבדלי גרסאות

תוכן שנמחק תוכן שנוסף
התחלה: תרגום מאנגלית. מוכן למרחב הערכים, אני חושב.
 
מ ←‏עצרת: עיצוב
שורה 54:
המימוש הזה של פונקציית העצרת איננו מובטח שיעצור, כיוון שארגומנט שלילי יגרום לשרשרת אינסופית של קריאות רקורסיביות. מימוש יציב יותר יבדוק שהארגומנט הינו אי-שלילי, בצורה הבאה:
<div style="direction: ltr;">
fun fact n = let
fun fac 0 = 1
| fac n = n * fac (n - 1)
in
if (n < 0) then raise Fail "negative argument"
else fac n
end</div>
המקרה הבעייתי (מספר שלילי) מנוהל בעזרת מנגנון ה[[טיפול בחריגות (תכנות)|טיפול בחריגות]] של השפה.
 
הפונקציה יכולה להיכתב בצורה יעילה יותר על ידי שימוש ברקורסיית-זנב, כלומר רקורסיה שבה לא מבוצע כל חישוב לאחר הקריאה הרקורסיבית בפונקציה הקוראת, וה[[מחסנית (מבנה נתונים)]] לא תצטרך לגדול ביחס ישר למספר הקריאות לפונקציה. זאת ניתן להשיג בעזרת שימוש פרמטר נוסף, "צובר" (Accumulator) עבור הפונקציה הפנימית:
<div style="direction: ltr;">
fun factorial n = let
fun fac (0, acc) = acc
| fac (n, acc) = fac (n - 1, n*acc)
in
if (n < 0) then raise Fail "negative argument"
else fac (n, 1)
end</div>
 
==ראו גם==