רקורסיה. - עמוד 2 - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

רקורסיה.


THE-MASTER

Recommended Posts

נראה לי שלא הבנת אותי נכון (או אולי ההפך)

זאת התוכנית המתוקנת שכנראה תעבוד......

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

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

turnlist(h,&h)

void turnlist(struct item *hdptr,struct item **begin)

{

if (hdptr!=NULL && hdptr->next!=NULL)

turnlist(hdptr->next,begin);

if (hdptr!=NULL && hdptr!=*begin && hdptr->next!=*begin)

{

change(&hdptr->phone,&(*begin)->phone);

*begin=*begin->next;

}

}

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

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

turnlist(&h)

void turnlist(struct item **hdptr)

{

struct item **begin;

begin=hdptr;

if (*hdptr!=NULL && *hdptr->next!=NULL)

turnlist(&(*hdptr)->next);

if (*hdptr!=NULL && *hdptr!=*begin && *hdptr->next!=*begin)

{

change(&(*hdptr)->phone,&(*begin)->phone);

*begin=*begin->next;

}

}

קישור לתוכן
שתף באתרים אחרים

אני יודע שעדיף להשתמש ברשימה דו כיוונית אבל הכל בשביל הבנת הרעיון של הבעיה.

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

קישור לתוכן
שתף באתרים אחרים

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

אם בכל זאת אתה ממש רוצה להעביר רק פרמטר אחד אתה יכול לעשות את זה בצורה של אקומולציה, למשל (כותב מהראש, לא נבדק)

struct item** trunlist(struct item** hdptr)
{
if (*hdptr == NULL)
return NULL;
return concat(hdptr->next,turnlist(hdptr->next));
}

כאשר די ברור מה הפונקציה concat (רמז, לשרשר) אמורה לעשות

מטי.

קישור לתוכן
שתף באתרים אחרים

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

1 למה אתה שולח מצביע למצביע כאשר אתה לא מצבע שינוי בתוך הפונקצייה????

2 איך אתה מחזיר בפונקצייה עם ערך מוחזר מצביע למצביע NULL?.?

3 איך אתה שולח לפונקצייה concat ערכים בצורה הזאת hdptr-> כאשר מדובר במצביע למצביע???

4 מה הפונקציה concat עושה ??

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

קישור לתוכן
שתף באתרים אחרים

איך אתה שולח לפונקצייה concat ערכים בצורה הזאת hdptr-> כאשר מדובר במצביע למצביע???

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

אני אשתמש בתכנית יותר פשוטה להדגים את הרעיון - נממש עצרת :


int fuct(int n)
if (n<=1)
return 1; /*A*/
return n*fuct(n-1);

שים לב שהחזרת 1 (A) היא המקרה בסיס בדיוק כמו החזרת NULL (שוב, בקשר למשחק בפוינטרים, לא יודע - תבדוק)

במקרה שלנו, הפונקציה * היא המקבילה לפונקציה . concat

לשאלתך, הפונקציה concat משרשרת או מוסיפה איבר לרשימה נתונה.

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

מטי.

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...