1) כתוב פונקציה רקורסיבית RecursiveMult שמבצעת
כפל באמצעות חיבור. רמז: יש צורך בפונקציה נוספת Mult, שתקרא ל RecursiveMult.
תשובה
תשובה:
Procedure Mult(n)
Return RecursiveMULT(n,n);
End;
Procedure RecursiveMULT(n,k)
If k=0
return 0;
Else
Return n + RecursiveMULT(n,k-1);
End;
End;
הסתר תשובה
2) יש לחשב חישוב עצרת חלקי שבו מכפילים כל איבר
שני, לדוגמא עבור הקלט 5, יש להחזיר 1*3*5=15. האם הפונקציה הבאה
נכונה:
Procedure SemiFactor(n)
If n=1 return 1;
Else
X = semiFactor(n-2);
Return (n*x);
End;
End;
תשובה
תשובה: לא. לא כל מקרי הקצה מטופלים. אם n יהיה זוגי,
נקלע ללולאה אין סופית, מכיוון שבכך שאנו מחסירים ממנו 2 כל פעם,
הוא יגיע ל- 2 ואחר כך ל- 0, מבלי להשתוות ל- 1.
פתרון נכון יהיה כזה:
Procedure SemiFactor(n)
If n=1 return 1;
if n=2 return 2;
Else
X = semiFactor(n-2);
Return (n*x);
End;
End;
הסתר תשובה
3) יש ליצור רשימה
באורך N. האם הפונקציה הבאה תעשה את העבודה:
Item{int val, Item *next}
Procedure CreateList(n)
If n=1
Item itm = CreateItem();
Return itm;
Else
Item itm = CreateItem();
X = CreateList (n-1);
Itm.next = X;
Return (itm);
End;
End;
תשובה
תשובה: כן. כל מקרי הקצה מטופלים נכונה, ואם הפונקציה
תעבוד נכון עבור n-1 היא תעבוד נכון גם עבור n.
הסתר תשובה