ערכתי לאחרונה בתאריך 20.12.05 בשעה 00:46 בברכה, אופירוש
הלכת ממש רחוק עם הפתרון שלך ...
קודם כל השתמשת ב - 5 (!!!) פונקציות במקום באחת כמו שביקשו ... איפה היופי בריקורסיה פה ? עשית עיקופים במקום להבין את הריקורסיה . - כאן כבר היו פוסלים לך את התשובה מראש .
שנית ... השתמשת מלא בלולאות - אין צורך אפילו באחת ...
וכתוצאה מהבלגן לוקח לתוכנית כמה דקות לרוץ ...מצורפת דוגמא שכתבתי עכשיו (ב - VB - תתאר לעצמך באיזה מהירות היא תרוץ ב - C).
בפונקציה אחת , פחות מ - 15 שורות .
הפונקציה רצה בפחות משניה בממוצע (עבור ערך True) ופחות מ -10 שניות (עבור ערך False) - כמובן שמדובר על 10 מטבעות בדיוק .
* האמת שיכולתי לחסוך 6-7 שורות של תנאים לקראת הסוף ולרשום את זה בשורה אחת כמו למעלה , אבל זה משפר את הביצועים במקרה של ערך True , אחרת תהיה לפונקציה מהירות ריצה דומה למקרה ה - False (כ - 10 שניות ל- 10 מטבעות) גם כאשר הפונקציה מצאה קומבינציה אפשרית ... אז ספגתי את השורות המיותרות לטובת ביצועים 
Private Function FindCombination(ByVal CoinsLeft As Integer, ByVal SumLeft As Currency) As Boolean Dim blnFlag As Boolean If CoinsLeft = 1 Then Test = (SumLeft = 0.5) Or (SumLeft = 1) Or (SumLeft = 5) Or (SumLeft = 10) _ Or (SumLeft = 50) Or (SumLeft = 100) Else blnFlag = Test(CoinsLeft - 1, SumLeft - 0.5) If Not blnFlag Then blnFlag = Test(CoinsLeft - 1, SumLeft - 1) If Not blnFlag Then blnFlag = Test(CoinsLeft - 1, SumLeft - 5) If Not blnFlag Then blnFlag = Test(CoinsLeft - 1, SumLeft - 10) If Not blnFlag Then blnFlag = Test(CoinsLeft - 1, SumLeft - 50) If Not blnFlag Then blnFlag = Test(CoinsLeft - 1, SumLeft - 100) Test = blnFlag End If End Function
|
ובכתיב קצר (ללא יתרון למקרה ה - True)
Private Function FindCombination(ByVal CoinsLeft As Integer, ByVal SumLeft As Currency) As Boolean If CoinsLeft = 1 Then FindCombination = (SumLeft = 0.5) Or (SumLeft = 1) Or (SumLeft = 5) Or (SumLeft = 10) _ Or (SumLeft = 50) Or (SumLeft = 100) Else FindCombination = FindCombination(CoinsLeft - 1, SumLeft - 0.5) Or FindCombination(CoinsLeft - 1, SumLeft - 1) _ Or FindCombination(CoinsLeft - 1, SumLeft - 5) Or FindCombination(CoinsLeft - 1, SumLeft - 10) _ Or FindCombination(CoinsLeft - 1, SumLeft - 50) Or FindCombination(CoinsLeft - 1, SumLeft - 100) End If End Function
|
תעשו חיים ...
