נושאים פעיליםנושאים פעילים  הצגת רשימה של חברי הפורוםרשימת משתמשים  חיפוש בפורוםחיפוש  עזרהעזרה
  הרשמההרשמה  התחברותהתחברות RSS עדכונים
תיכנות
RSS UnderWarrior Forums : RSS תיכנות
נושא

נושא: תרגיל בג’אווה - רקורסיה

שליחת תגובהשליחת נושא חדש
כותב
הודעה << נושא קודם | נושא הבא >>
אורח
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 03 October 2007 בשעה 15:17 | IP רשוּם
ציטוט אורח

יש לי תרגיל ב Java שלא הצלחתי לפתור אשמח אם תעזרו לי במציאות הפתרון.

התרגיל הוא: כתוב פונקציה שמקבלת מערך ובודקת אם הוא מסודר בצורה עולה.

עכשיו לא הבנתי איך זה אפשרי לעשות רקורסיה אם הפונקציה מקבלת רק מערך?

ואפילו אם היא גם מקבלת מערך וגם אורך מערך.. כי צריך להחזיר BOOLEAN

אחרי הכול, אם הוא מסודר בצורה עולה או לא.

 

חזרה לתחילת העמוד הצג את כרטיס החבר של אורח חפש הודעות אחרות של אורח בקר בדף הבית של אורח
 
inHaze
משתמש פעיל
משתמש פעיל
סמל אישי

הצטרף / הצטרפה: 23 November 2006
מדינה: Israel
משתמש: מנותק/ת
הודעות: 119
נשלח בתאריך: 03 October 2007 בשעה 15:36 | IP רשוּם
ציטוט inHaze

טיפ-  כדי לקבל את אורך המערך אתה יכול לעשות כך:

sizeof (array) / sizeof(type); //this is a C code but the idea is good for java also

תנסה להמשיך מכאן... בהצלחה!!



__________________
הבלוג שלי
חזרה לתחילת העמוד הצג את כרטיס החבר של inHaze חפש הודעות אחרות של inHaze
 
elseif
משתמש פעיל
משתמש פעיל


הצטרף / הצטרפה: 10 August 2007
משתמש: מנותק/ת
הודעות: 86
נשלח בתאריך: 03 October 2007 בשעה 16:15 | IP רשוּם
ציטוט elseif

ברקורסיה חשובים שתי דברים :
1) תנאי עצירת - ברגע שהוא מתבצע אתה מחזירה תוצאה
2) צעד רקורסיבי - זה החלק שבו הפונקציה מזמינה את עצמה , אך אם שינוי מסויים של הפרמטרים שהיו לה

מקובל קודם כול לבדוק את התנאי עצירה ואם הוא לא נכון להמשיך
חזרה לתחילת העמוד הצג את כרטיס החבר של elseif חפש הודעות אחרות של elseif
 
צחי@
משתמש חבר
משתמש חבר


הצטרף / הצטרפה: 02 January 2007
מדינה: Israel
משתמש: מנותק/ת
הודעות: 209
נשלח בתאריך: 03 October 2007 בשעה 19:48 | IP רשוּם
ציטוט צחי@

כתיבת פונקציה רקורסיבית דומה להוכחה אינדוקציה -
באינדוקציה יש 3 שלבים:
1. בסיס: בדיקת נכונות עבור בסיס כלשהו, למשל n=1
2. הנחה עבור n כלשהו
3. הוכחה שמתקיים גם עבור n+1

בפונקציה רקורסיבית, הבסיס הוא למעשה תנאי העצירה -  אם נייצג את גודל המערך ע"י n , אז עבור מערך בגודל n=1 התשובה ברורה מאליה (חיובית).
השלב השני הוא ההנחה - אז אם יש לך מערך בגודל n+1, אתה יכול להפעיל את הפונקציה(בצורה רקורסיבית) על n האיברים הראשונים ו"להניח" שהיא תעבוד נכון - כלומר תחזיר true אם n האיברים הראשונים מסודרים בסדר עולה ו-false אחרת.
 כל שעליך לעשות כעת כדי להראות שכל המערך מסודר בסדר עולה (או שלא) הוא לבדוק את האיבר ה-n+1 ואת גודלו לעומת גודלו של האיבר ה-n - זהו השלב השלישי.
כמובן שהתוצאה שמוחזרת ע"י הפונקציה היא true אם ורק אם תוצאת הקריאה של הפונקציה על n האיברים הראשונים היא true וגם האיבר ה-n+1 הוא גדול או שווה לאיבר ה-n.
 על הפונקציה לקבל, בנוסף למערך, גם את מספר האיברים שעליה לבדוק החל מתחילת המערך. ישנן דרכים נוספות ויותר יעילות לעשות זאת ברקורסיה - למשל לפצל את המערך בכל קריאה ל-2 ולבדוק כל חצי בנפרד. זה לא יהיה יותר מהיר, אבל יותר חסכוני בזכרון מחסנית.
 כמובן שהכי יעיל לעשות את זה ללא רקורסיה :).

חזרה לתחילת העמוד הצג את כרטיס החבר של צחי@ חפש הודעות אחרות של צחי@ בקר בדף הבית של צחי@
 
yehuda
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 02 December 2007 בשעה 23:31 | IP רשוּם
ציטוט yehuda

בג'אווה אורך מערך הוא:
int x=arr.length;
כאשר x משתנה מסוג שלם ו-arr הוא שם המערך.
מערך דו-מימדי:
int x=arr.length;
int y=arr[i].length;

חזרה לתחילת העמוד הצג את כרטיס החבר של yehuda חפש הודעות אחרות של yehuda בקר בדף הבית של yehuda
 
decimal
משתמש פעיל
משתמש פעיל


הצטרף / הצטרפה: 08 November 2007
משתמש: מנותק/ת
הודעות: 118
נשלח בתאריך: 03 December 2007 בשעה 04:40 | IP רשוּם
ציטוט decimal

לא נראה לי שזה אפרי אםם הפונקציה מקבלת רק מערך , אלא אם כן מורידים תא מהמערך שאת זה אני לא יודע איך עושים אני יודע "כאילו" להוריד תא בערזת מציין של מיקום שמתקדם כול פעם אבל האורך נשאר קבוע ופה בהנחה שהפונקציה מקבלת רק מערל אני חושב שכול פעם צריך להוריד תא אחד ואז אורך המערך יקטן ב 1
חזרה לתחילת העמוד הצג את כרטיס החבר של decimal חפש הודעות אחרות של decimal
 
זה אפשרי ביותר
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 04 February 2009 בשעה 20:19 | IP רשוּם
ציטוט זה אפשרי ביותר

אני לא יודע כמה זה רלוונטי יחסית לתאריך האשכול הזה.

אבל אפשר לבדוק את שתי המקומות האחרונים כל פעם ואז ליצור מערך קטן ב1 מהמערך המקורי ככה שלא יהיה בו האיבר האחרון ואז לשלוח אותו ברקורסיה עד שישארו רק שתי איברים.

חזרה לתחילת העמוד הצג את כרטיס החבר של זה אפשרי ביותר חפש הודעות אחרות של זה אפשרי ביותר בקר בדף הבית של זה אפשרי ביותר
 
ארנון
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 04 February 2009 בשעה 20:59 | IP רשוּם
ציטוט ארנון

הכוונה בתרגיל היא ליצור מעטפת לרקורסיה, כך שהשימוש בפעולה הרקורסיבית יקבל רק מערך. כך:
קוד:
public static bool IsUp(int[] arr)
{
    return IsUp(arr, 0);
}
public static bool IsUp(int[] arr, int i)
{
    if (arr.Length == 1) return true;
    if (arr.Length == i + 1) return true;
    if (arr[i] >= arr[i + 1]) return false;
    return IsUp(arr, i + 1);
}

בצורה כזאת ניתן יהיה לקרוא לפונקציה רק בעזרת המערך, זאת אומרת:
קוד:
IsUp(arr);


אבל אם עדיין רוצים שהפרמטר היחיד יהיה המערך, ניתן לעשות זאת כך:
קוד:
public static bool IsUp(int[] arr)
{
    if (arr.Length == 1) return true;
    int temp = arr[0];
    if (arr[0] >= arr[1]) return false;
    int[] arrTemp = new int[arr.Length - 1];
    for (int i = 0; i < arrTemp.Length; i++)
        arrTemp[i] = arr[i + 1];
    return IsUp(arrTemp);
}

חזרה לתחילת העמוד הצג את כרטיס החבר של ארנון חפש הודעות אחרות של ארנון בקר בדף הבית של ארנון
 
ארנון
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 05 February 2009 בשעה 13:29 | IP רשוּם
ציטוט ארנון

עכשיו אני שם לב שיש שורה מיותרת ברקורסיה השניה, לא צריך את int temp.
חזרה לתחילת העמוד הצג את כרטיס החבר של ארנון חפש הודעות אחרות של ארנון בקר בדף הבית של ארנון
 

אם ברצונך להגיב לנושא זה עליך קודם להתחבר
אם אינך רשום/ה כבר עליך להרשם

  שליחת תגובהשליחת נושא חדש
גרסת הדפסה גרסת הדפסה

קפיצה לפורום
אינך יכול/ה לשלוח נושאים חדשים בפורום זה
אינך יכול/ה להגיב לנושאים בפורום זה
אינך יכול/ה למחוק את הודעותיך ותגוביך בפורום זה
אינך יכול/ה לערוך את הודעותיך ותגובותיך בפורום זה
אינך יכול/ה לצור סקרים בפורום זה
אינך יכול/ה להצביע בסקרים בפורום זה