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

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

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


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 07 January 2009 בשעה 08:19 | IP רשוּם
ציטוט רקורסיה

אני צריך לכתוב תוכנית רקורסיבית  אשר מקבלת מערך של המספרים שלמים ומחזירה את האורך של התת סדרה העולה הכי ארוכה במערך.
יש לי רעיון והוא כך
f(i)- מוגדר להיות תת הסדרה הארוכה ביותר עד האיבר i

f(1)=1
f(i+1)=max{f(j)|1=<j=<i   and  A[j]<=A[i+1]}

העניין הוא שאני מוגבל בצורה הבאה:
אסור לי להשתמש בלולאות וכן אסור לי להשתמש בפונקציות עזר.
וכאן בדיוק הבעיה
בשביל לפתור את זה אני אצטרך פונקציה רקורסיבית אחת שעוברת על איברי המערך וכן פונקציית עזר שמוצאת לי את המקסימום בין אברי  f(j)
יש למישהו פתרון אחר? או כיצד לעשות זאת ללא פונקציית עזר?

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

יש לי רעיון והוא כך:
יש לסכום את כל האיברים שבמערך ולקבל את הסכום. לחלק אותו ב 2. ומה שצריך כעת זה למצוא האם י ש תת קבוצה במערך שמכסה את חצי מהסכום, אם כן אז יש חלוקה אחרת אין.

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

תודה


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


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 08 January 2009 בשעה 00:11 | IP רשוּם
ציטוט דוד

הנה פתרון רקורסיבי לשאלה הראשונה, אם לא הבנת משהו אני אסביר:
קוד:
public static int Solution(int[] Arr)
{
    return Solution(Arr, 0, 0, 0);
}
public static int Solution(int[] Arr, int i, int Count, int Sum)
{
    if (Arr.Length == 1) return 1;
    if (i == Arr.Length -1) return Sum+1;
    if (Arr[i + 1] > Arr[i]) Count++;
    else Count = 0;
    if (Count > Sum) Sum = Count;
    i++;
    return Solution(Arr, i, Count, Sum);
}

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


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 08 January 2009 בשעה 08:24 | IP רשוּם
ציטוט רקורסיה

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

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


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 08 January 2009 בשעה 12:56 | IP רשוּם
ציטוט hadas

שלום,

יש לי שאלה:

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

כתבתי משהו אומנם רקרוסיבי אבל אני עדיים תקועה עם for

כך שכנראה אני צריכה לשנות קו מחשבה.

יש למישהו פיתרון???

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


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 08 January 2009 בשעה 14:42 | IP רשוּם
ציטוט רקורסיה

אז ככה...

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


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 08 January 2009 בשעה 15:31 | IP רשוּם
ציטוט hadas

תודה על העצה:)

אמת שבדקתי שוב ומה שכתבתי לא מסתדר לי

יש לך משהו יותר ספציפי? כל דבר.. אני כבר על סף ייאוש

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


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

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


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

hadas:
אני יול לתת לך רעיון

תחשבי על זה כך:
כאשר אני רואה תו בפעם הראשונה אני רוצה לשמור אותו
וכאשר אני רואה אותו שוב אני לא רוצהשהוא יוצג
לכן מה שניתן לעשות זה להעביר חתימה של הפונקציה מערך שיקרא result
וכמובן שיש את מערך המקור שמכיל את התווים המקוריים נגיד source.
אז אם source={a,a,a,b,b,a,s,s,a,s}
אזי כאשר אני הראה את התו הראשון ב source אני אבדוק אם הוא נימצא ב result כמובן שהוא לא נמצא אזי אני אעתיק אותו ואמשיך רקורסיבית על שאר המערך.
כמובן שאני אגיע לתו השני ב source וכאשר אני אראה שוב a אני אבדוק אם הוא נימצא ב result וכעת הוא ימצא אזי אני אמשיך רקורסיבית על שאר המערך ולא אכני ס אותו ל result ככה באופן הזה כל מה שיחזור יותר מפעם אחת לא יכנס למערך התוצאה result
מקווה שזה יעזור.

לדוד:
ניקח את המערך הבא
{1,34,3,7,45,5,9}
תת הסדרה הרצופה הארוכה ביותר הוא 1,3,7,9


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


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

רקורסיה כתב:
אני צריך לכתוב תוכנית רקורסיבית  אשר מקבלת מערך של המספרים שלמים ומחזירה את האורך של התת סדרה העולה הכי ארוכה במערך.
יש לי רעיון והוא כך
f(i)- מוגדר להיות תת הסדרה הארוכה ביותר עד האיבר i

f(1)=1
f(i+1)=max{f(j)|1=<j=<i   and  A[j]<=A[i+1]}

העניין הוא שאני מוגבל בצורה הבאה:
אסור לי להשתמש בלולאות וכן אסור לי להשתמש בפונקציות עזר.
וכאן בדיוק הבעיה
בשביל לפתור את זה אני אצטרך פונקציה רקורסיבית אחת שעוברת על איברי המערך וכן פונקציית עזר שמוצאת לי את המקסימום בין אברי  f(j)
יש למישהו פתרון אחר? או כיצד לעשות זאת ללא פונקציית עזר?


 

כיצד עשית זאת בסופו של דבר?

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


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

אני יודע שכבר פתרת את השאלה הראשונה, אבל יש לי רעיון נחמד-
להשתמש באלגוריתם הרקורסיבי שרשמתי למעלה, ולהוסיף לו מיון ללא לולאות (בדיקת הרצף תתחיל רק לאחר קבלת true על מערך ממויין)... אחרי שממיינים אפשר פשוט לבדוק איבר איבר משמאל לימין אם המיקום הקודם שלו במערך גדול מזה של האיבר שלפניו אך קטן מזה של האיבר שאחריו. למנות את הרצף הארוך ביותר שמקיים את התנאי הזה וקיבלנו תשובה! הבנת למה התכוונתי? נשמע הגיוני?
חזרה לתחילת העמוד הצג את כרטיס החבר של דוד חפש הודעות אחרות של דוד בקר בדף הבית של דוד
 
אורח
אורח
אורח


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

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

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

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

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