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

נושא: רקורסיה

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


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

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

אם המספר מתחלק ב 2 להוריד ממנו מחצית.

אם המספר מתחלק ב 3 או 4 להוריד ממנו את מכפלת שתי ספרותיו האחרונות.

אם מתחלק ב 5, להוריד ממנו 42 בדיוק.

המטרה היא כאמור שבסוף ישאר לי 42.

לדוגמא- המספר 104

הוא מתחלק ב2 ולכן נפחית מחצית---------> נקבל 52

52 מתחלק ב 4 ולכן נפחית 5*2-------------> נקבל 42

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

 

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


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

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

אני אתאר את השלבים של הפונקציה:

1. קלוט מספר n

2. אם n<=42 , החזר את n. (תנאי העצירה).

3. אם n מתחלק ב-2, הפעל את הפונקציה מחדש על n/2 והכנס את התוצאה ל-x1

4. אם n מתחלק ב-3 או 4, הפעל את הפונקציה מחדש על

קוד:

((n%100)/10)*(n%10)

והכנס את התוצאה ל-x2

5. אם n מתחלק ב-5, הפעל את הפונקציה מחדש על n-42 והכנס את התוצאה ל-x3.

6. אם x1, x2 או x3 שווים ל-42, החזר 42, אחרת החזר 1- (סתם ערך שאינו 42).

מקווה שזה מובן.

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


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

כן זה מובן, אבל זה קצת יותר מורכב ממה שזה נראה.

מה קורה למשל אם נכנס מספר שמסוגל להתחלק באחר מגורמי החלוקה הנ"ל אך לא בהכרח יוביל ל 42. לדוגמא 75. חשבתי גם במקום X1 לעשות מערך שיאגור את כל השלבים ושיתאפס במידה ולא הגיע ל 42.

אני מקווה שחידדתי יותר את הקושי ותודה.

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


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

אם המספר יוביל למספר הגדול מ-42 - הרקורסיה תופעל גם עליו.

אם המספר יוביל למספר הקטן מ-42 - הרקורסיה תיעצר.

מכיוון שבכל שלב, בודקים את 3 התנאים - הפונקציה לא תיתקע עם מספר לא תקין.

אם אתה משתמש במערך - באותה מידה אל תשתמש ברקורסיה. הרקורסיה באה לבטל את הצורך בשימוש במערך או שיטה איטרטיבית אחרת.

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

הצטרף / הצטרפה: 16 July 2005
מדינה: Israel
משתמש: מנותק/ת
הודעות: 4637
נשלח בתאריך: 10 June 2007 בשעה 23:30 | IP רשוּם
ציטוט shoshan

הממ...אתה צריך לבדוק אם אפשר את לפרט את השלבים לפתרון

קוד:

static void Main(string[] args)

{

    Console.Write("N: ");

    int n = int.Parse(Console.ReadLine());

    if (!doit(n, 1))

        Console.WriteLine("CANNOT DO...");

    else

        Console.WriteLine("the order of commands is reversed...because they are not a part of the objective of the function...");

}

 

// (N & 3) == 0

// the two last bits of N are 0

// n % 4 == 0

// simply faster...

// (n & 1) == 0 ==> the same...

private static bool doit(int n, int step)

{

    if (step == 3)

        return n == 42;

    if (((n & 1) == 0) && (doit(n >> 1, step + 1)))

    {

        Console.WriteLine("devide be 2");

        return true;

    }

    if ((n % 3 == 0 || (n & 3) == 0) && (doit(n - (n % 10) * (n / 10 % 10), step + 1)))

    {

        Console.WriteLine("substract miltiply of two last digits");

        return true;

    }

    if ((n % 5 == 0) && (doit(n - 42, step + 1)))

    {

        Console.WriteLine("substract 42");

        return true;

    }

 

    return false;

}


C#, נכון ?


__________________
עד מתי רשעים יעלוזו?

עַל כֵּן אֶמְאַס וְנִחַמְתִּי עַל עָפָר וָאֵפֶר.
חזרה לתחילת העמוד הצג את כרטיס החבר של shoshan חפש הודעות אחרות של shoshan בקר בדף הבית של shoshan
 
רונן
אורח
אורח


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

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

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

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

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