12-07-2015, 17:41
|
|
מנהל פורום מערכות הפעלה - הרובע המייקרוסופטי.
|
|
חבר מתאריך: 07.10.04
הודעות: 13,777
|
|
הציעו לך פתרון שמבוסס על משתנים גלובלים, כדי לחסוך בזיכרון כי גם-כך השאלה לא... עוזרת.
בכול מקרה, אם אתה מתעקש לעבוד ללא משתנים גלובאלים (שמוגדרים מחוץ לפונקצייה הראשית וככאלו כל הפונקציות מכירות אותן) הפתרון שלך יהיה משהו כזה:
קוד:
int rec(arr[], arr_size) {
return tail_rec(arr, arr[arr_size-1], arr_size-1, count);
}
int tail_rec(int[] arr, int min, int index, int count) {
if (index < 0)
retrun count;
if (arr[index] == min)
count++;
if (arr[index] < min) {
count = 1;
min = arr[index];
}
return (tail_rec(arr, min, index - 1, count));
}
הסבר זריז: rec הוא הפונקצייה לה קוראים
tail_rec (שם לא מתאים אבל העתקתי מיכם) הוא מה שסופר את מספר החזרות של המספר המינימלי.
אנחנו מתחילים מאינדקס size (סוף המערך) והולכים אחורה.
אם מצאנו מספר קטן יותר - נאפס את המונה,
אם מצאנו מספר זהה למינימום - נגדיל את המונה,
אם אנחנו לא באינדקס 0 (הגענו לתחילת המערך) - נחזיר את התשובה של מערך "קטן ב-1",
למה מרכאות? כי זה אינדקס, לא גודל, ולכן קשה לראות איך זה מסביר מה זה רקורסיה.
נכתב זריז, בלי בדיקה, יכול להיות שיש טיפה תיקונים שם, אבל זה הרעיון הכללי
_____________________________________
|