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

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

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


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

בלוח דו-ממדי בגודל  ´ n, אשר כל אחת ממשבצותיו יכולה להיות ריקה או מלאה, נקרא כתם לרצף משבצות מלאות בעלות צלע משותפת או קדקוד משותף.

 

גודל הכתם הוא מספר המשבצות המרכיבות את הכתם.

ייתכנו מספר כתמים בלוח.

 

דוגמה:

נסמן משבצת מלאה באמצעות התו ´ ומשבצת ריקה באמצעות תו רווח.

הלוח

4

3

2

1

0

 

´

 

 

´

 

0

´

´

 

 

´

1

 

´

´

 

 

2

 

 

 

 

´

3

 

 

´

´

´

4


 

מכיל 3 כתמים:

כתם המורכב ממשבצות (1, 0), (0, 1)  וגודלו 2.

כתם המורכב ממשבצות (3, 2), (2, 2), (4, 1), (3, 1), (4, 0)  וגודלו 5.

כתם המורכב ממשבצות (2, 4), (1, 4), (0, 4), (0, 3)  וגודלו 4.

 

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

 

חתימת השיטה תהיה:

public static int stain (int [][] mat, int row, int col)

 

לדוגמה: עבור המערך מהדוגמה הקודמת וזוג המספרים (3, 1) יוחזר 5, ועבור זוג המספרים (4, 4) יוחזר אפס.

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


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

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


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

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


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

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


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

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


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

אני לא יודע JAVA אבל פתרתי ב C# שזה דומה עם לשנות את המערך :
קוד:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            char[,] a = new char[5, 5];
            Console.Write("row : ");
            int row = int.Parse(Console.ReadLine());
            Console.Write("col : ");
            int col = int.Parse(Console.ReadLine());
            Console.WriteLine("insert chars :");
            ReadArray(a);
            Console.Clear();
            PrintArray(a);
            Console.WriteLine(GetCount(a, row, col));
        }
        static int GetCount(char[,] a, int i, int j)
        {
            int localCounter = 0;
            if (a[i, j] == '`')
            {
                if ((i == 0) || (i == a.GetLength(0) - 1) || (j == 0) || (j == a.GetLength(1) - 1))
                {
                    a[i, j] = ' ';
                    return 1;
                }
                else
                {
                    a[i, j] = ' ';
                    localCounter = localCounter + 1;
                    localCounter = localCounter + GetCount(a, i + 1, j);
                    localCounter = localCounter + GetCount(a, i + 1, j + 1);
                    localCounter = localCounter + GetCount(a, i, j + 1);
                    localCounter = localCounter + GetCount(a, i - 1, j + 1);
                    localCounter = localCounter + GetCount(a, i - 1, j);
                    localCounter = localCounter + GetCount(a, i - 1, j - 1);
                    localCounter = localCounter + GetCount(a, i, j - 1);
                    localCounter = localCounter + GetCount(a, i - 1, j - 1);
                }
            }
            return localCounter;
        }
        static void ReadArray(char[,] a)
        {
            int i, j;
            for (i = 0; i < a.GetLength(0); i++)
            {
                for (j = 0; j < a.GetLength(1); j++)
                {
                    a[i, j] = char.Parse(Console.ReadLine());
                }
            }
        }
        static void PrintArray(char[,] a)
        {
            int i, j;
            for (i = 0; i < a.GetLength(0); i++)
            {
                for (j = 0; j < a.GetLength(1) - 1; j++)
                {
                    Console.Write(a[i, j] + "|");
                }
                Console.WriteLine(a[i, j]);
            }
        }
    }
}


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


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

אגב איך מתכתנים ב JAVA ב  WINDOWS ? ( ומקמפלים ? ) מה צריך ?
חזרה לתחילת העמוד הצג את כרטיס החבר של decimal חפש הודעות אחרות של decimal
 
java
אורח
אורח


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

היי תודה רבה!
אני לא מבין c אבל אני אנסה בכל זאת לנסות לתרגם את זה איכשהו ל-java...
כדי לכתוב תוכנית ב-java ב-windows צריך מהדר.יש הרבה מהדרים וכל אחד בוחר לו מהדר שנוח לו לעבוד איתו.
חזרה לתחילת העמוד הצג את כרטיס החבר של java חפש הודעות אחרות של java בקר בדף הבית של java
 
java
אורח
אורח


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

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


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

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

char[,] a = new char[5, 5];
            Console.Write("row : ");
            int row = int.Parse(Console.ReadLine());
            Console.Write("col : ");
            int col = int.Parse(Console.ReadLine());
            Console.WriteLine("insert chars :");
            ReadArray(a);

הכנסת המערך , קליטת המיקום המבוקש , וקליטת כול התווים למערך
קוד:

PrintArray(a);

מדפיס את המערך באופן דו מימדי ככה שתראה אותו יפה כזה
קוד:

Console.WriteLine(GetCount(a, row, col));

עכשיו מזמין את הפונקציה ומדפיס את מה שהיא מחזירה שזה בעצם גודל הכתם במערך a  בשורה row בעמודה col ועכשיו לפונקציה :
localCounter הוא בעיקרון תמיד סופר את הכתמים שקשורים לריצה המסויימת הזאת ואת כול הפונקציות שאחרות שהיא הזמיה בצעד הרקורסיבי ומחזירה אותם לפונקציה שהזמינה אותה
הוא מתחיל מ 0 כי תמיד מתחילים לספור מ 0
קוד:

if (a[i, j] == '`')

שים לב זה התנאי העיקרי , אם הוא לא מתקיים ז"א שזה לא כתם או חלק מכתם ואז מחזירים את localCounter שמקודם שמנו בו 0 אז זה מתאים כי אם אין כתם אז הגודל שלו יהיה אפס
כול זה אם אין כתם והתנאי לא מתקיים , אם הוא כן מתקיים :
קוד:

if ((i == 0) || (i == a.GetLength(0) - 1) || (j == 0) || (j == a.GetLength(1) - 1))

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

a[i, j] = ' ';
                    localCounter = localCounter + 1;
                    localCounter = localCounter + GetCount(a, i + 1, j);
                    localCounter = localCounter + GetCount(a, i + 1, j + 1);
                    localCounter = localCounter + GetCount(a, i, j + 1);
                    localCounter = localCounter + GetCount(a, i - 1, j + 1);
                    localCounter = localCounter + GetCount(a, i - 1, j);
                    localCounter = localCounter + GetCount(a, i - 1, j - 1);
                    localCounter = localCounter + GetCount(a, i, j - 1);
                    localCounter = localCounter + GetCount(a, i - 1, j - 1);

הסבר :
שמים בו רווח כדי לא להחשיב אותו שוב
מוסיפים אחד כדי לספר אותו
ואז מזמינים את הפונקציה עם כול התאים המקיפים אותו
זהו בעיקרון מקווה שתבין מציע לך להוריד
visual c# express זה בחינם כדי שתוכל להריץ קודם ב C# ולהבין איך הם עובדים
ותביא שם של איזה COMPILER ל JAVA בשביל WINDOWS נגיד מה שאתה משתמש בו
חזרה לתחילת העמוד הצג את כרטיס החבר של decimal חפש הודעות אחרות של decimal
 
inHaze
משתמש פעיל
משתמש פעיל
סמל אישי

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

decimal כתב:
אגב איך מתכתנים ב JAVA ב  WINDOWS ? ( ומקמפלים ? ) מה צריך ?

Java יכולה לרוץ מעל כל מע' הפעלה בגלל ה: JVM - Java Virtual Machine



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


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

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


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

תוריד מפה קומפיילר http://www.bluej.org
זה קומפיילר קל יחסית לאחרים...יש קומפיילרים אחרים יותר קשים שצריך נסיון כדי לעבוד איתם.
חזרה לתחילת העמוד הצג את כרטיס החבר של java חפש הודעות אחרות של java בקר בדף הבית של java
 
java
אורח
אורח


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

תרגמתי לג'אוה...הבנתי את הרעיון שלך אבל הוא לא עובד...ניסיתי 1,3 במערך שבשאלה ומוחזר 5 שזה בסדר אבל במקרים אחרים זה לא עובד למשל 4,2 מחזיר 1(צריך להחזיר 4)   
 
זה המערך שבדקתי עליו (כמו בשאלה) :                                                                                         

 

private static char mat [][] =
{
    {' ' , 'x' , ' ' , ' ' , 'x'},
    {'x' , ' ' , ' ' , 'x' , 'x'},
    {' ' , ' ' , 'x' , 'x' , ' '},
    {'x' , ' ' , ' ' , ' ' , ' '},
    {'x' , 'x' , 'x' , ' ' , ' '},
} ;




public static int GetCount(char[][] a, int i, int j)
{
            int localCounter = 0;
 
            if (a[i][j] == 'x')
            {
                if ((i == 0) || (i == a.length - 1) || (j == 0) || (j == a.length - 1))
                {
                    a[i][j] = ' ';
                    return 1;
                }
                else
                {
                    a[i][j] = ' ';
                    localCounter++;
                   
                    localCounter+=GetCount(a,i-1,j-1);
                    localCounter+=GetCount(a,i-1,j);
                    localCounter+=GetCount(a,i-1,j+1);
                    localCounter+=GetCount(a,i,j-1);
                    localCounter+=GetCount(a,i,j+1);
                    localCounter+=GetCount(a,i+1,j-1);
                    localCounter+=GetCount(a,i+1,j);
                    localCounter+=GetCount(a,i+1,j+1);
                }
            }
            return localCounter;
}

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


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

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


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

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            char[,] a = new char[5, 5];
            a[0, 0] = ' ';
            a[0, 1] = 'x';
            a[0, 2] = ' ';
            a[0, 3] = ' ';
            a[0, 4] = 'x';
            a[1, 0] = 'x';
            a[1, 1] = ' ';
            a[1, 2] = ' ';
            a[1, 3] = 'x';
            a[1, 4] = 'x';
            a[2, 0] = ' ';
            a[2, 1] = ' ';
            a[2, 2] = 'x';
            a[2, 3] = 'x';
            a[2, 4] = ' ';
            a[3, 0] = 'x';
            a[3, 1] = ' ';
            a[3, 2] = ' ';
            a[3, 3] = ' ';
            a[3, 4] = ' ';
            a[4, 0] = 'x';
            a[4, 1] = 'x';
            a[4, 2] = 'x';
            a[4, 3] = ' ';
            a[4, 4] = ' ';
            Console.Write("row : ");
            int row = int.Parse(Console.ReadLine());
            Console.Write("col : ");
            int col = int.Parse(Console.ReadLine());
            //Console.WriteLine("insert chars :");
            //ReadArray(a);
            Console.Clear();
            PrintArray(a);
            Console.WriteLine(GetCount(a, row, col));
        }
        static int GetCount(char[,] a, int i, int j)
        {
            int localCounter = 0;
            if ((i < 0) || (i >= a.GetLength(0)) || (j < 0) || (j >= a.GetLength(1)))
            {
                return 0;
            }
            if (a[i, j] != 'x')
            {
                return 0;
            }
            a[i, j] = ' ';
            localCounter = 1;
            localCounter += GetCount(a, i + 1, j);
            localCounter += GetCount(a, i + 1, j + 1);
            localCounter += GetCount(a, i, j + 1);
            localCounter += GetCount(a, i - 1, j + 1);
            localCounter += GetCount(a, i - 1, j);
            localCounter += GetCount(a, i - 1, j - 1);
            localCounter += GetCount(a, i, j - 1);
            localCounter += GetCount(a, i - 1, j - 1);
            return localCounter;
        }
        static void ReadArray(char[,] a)
        {
            int i, j;
            for (i = 0; i < a.GetLength(0); i++)
            {
                for (j = 0; j < a.GetLength(1); j++)
                {
                    a[i, j] = char.Parse(Console.ReadLine());
                }
            }
        }
        static void PrintArray(char[,] a)
        {
            int i, j;
            for (i = 0; i < a.GetLength(0); i++)
            {
                for (j = 0; j < a.GetLength(1) - 1; j++)
                {
                    Console.Write(a[i, j] + "|");
                }
                Console.WriteLine(a[i, j]);
            }
        }
    }
}


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


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

חבר'ה, אני יודע שיש שביתה - אבל זאת לא סיבה לכתוב תגובות ב-5:13 לפנות בוקר (אלא אם כן אתה עובד כמחלק עיתונים או משהו כזה) :)

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


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

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

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

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

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