שלום לכולם...

Janem

New member
שלום לכולם...

אני צריך לכתוב פונקציה רקורסיבית שמחלקת מספר לסכומים שלו באופן הבא:
נגיד המספר המדובר הוא 7:
אז הפלט יהיה:
7
1 6
2 5
1 1 5
3 4
1 2 4
1 1 1 4
1 3 3
1 1 2 3
1 1 1 1 3
וכו...

בקוד שכתבתי הפלט יוצא:
7
1 6
2 5
1 1
3 4
1 2
1 1 1
1 3 3
1 1 2
1 1 1 1

חסרים בו מספרים. מישהו בבקשה יכול לומר לי מה לא בסדר?
 

Janem

New member
אני מצטער שזה לא קובץ משום מה זה לא מצליח ל

להעלות אותו.

#include <stdio.h>
void Partition(int n, int limit, int value[29]);


void main(){
int n=0,i=0;
int limit, value[29];
for (i=0; i<30; i++)
value = 0;
scanf("%d",&limit);
Partition(limit,limit,value);
}

void Partition(int n, int limit, int value[29])
{
int i, k=1, min;

if (n < limit)
min = n;
else
min = limit;
if (n>0)
{
for (i=min; i>0; i--)
{
for (k=0; k<30; k++)
{
if (value[k] == 0)
{
value[k] = i;
break;
}
}

Partition(n-i, i, value);
}
}
else
{
for (i=0; i<30; i++)
if (value != 0)
printf("%2d", value);
printf("\n");
for (i=0; i<30; i++)
value = 0;
}
}
 

פרסאוס

New member
למה בדיוק המערך?

ואתה מעביר אותו לא נכון. מערך מעבירים במצביע.
 

Janem

New member
המערך

הוא כדי לשמור את כל האפשרויות של הסכומים. נגיד אם זה 7 אז 6 1, 5 2 וכו'...
ההעברה של המערך עובדת. הבעיה שאסור לי להשתמש במצביעים בעבודה הזאת.
הבעיה שלי ספציפית היא שאני מוחק את המערך אחרי כל הדפסה, ואיכשהו, חלק מהאפשרויות לא מודפסות:
נגיד 2 5 יודפס אבל כשצריך לפרק את 2, לא יודפס לי מההתחלה 1 1 2 5, אלא רק 1 1, בלי ה2 5 בהתחלה, כי כנראה בגלל שאיפסתי את הערך ששומר אותם לצורך הדפסה.
 

פרסאוס

New member
למה לשמור על האפשרויות?

אתה יודע מאיפה אתה מתחיל ולאן אתה רוצה להגיע.
אין סיבה להשתמש במערך.
 

Janem

New member
כי

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

פרסאוס

New member
ראשית החתימה שלך ארוכה מדי

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

Janem

New member
ראשית...

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

nocgod

New member
הוא חוזר על עצמו

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

Janem

New member
את כל העבודה שלי?

באמת? לא ידעתי שאתה מכיר אותי, או את מה שאני מתעסק בו...
דבר שני, אתה העו"ד שלו? (עכשיו אני יודע במה אתה מתעסק...)

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

CharlyBoO

New member
פרסאוס- איך ניתן לרשום דבר כזה?

איך הפונקציה הרקורסיבית נראת?
 

פרסאוס

New member
יש כל מיני סקיצות לעניין

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

CharlyBoO

New member
?????.

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

nocgod

New member
דווקא אותי מעניין איך לעשות את זה בלי מערך

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

פרסאוס

New member
יש לך תנאי הדפסה

1. מספר מודפס
2. מספר מקור
אם המספר המודפס קטן ממספר המקור, יש להדפיס שארית.
3. השארית גדולה מ1
אם השארית גדולה מאחד יש להדפיס את המספר המודפס שוב בפירוק השארית.
 

nocgod

New member
מה שאתה לא מבין הוא שאתה כבר משתמש במצביע

אבל לא נהרוס לך את האשליה שאתה לא

שם המערך שלך הוא מצביע לאיבר הראשון במערך בין אם תרצה בזה ובין אם לא
 

Janem

New member
וואלה? :)

צורת הכתיבה זה מה שחשוב. התוצאה זהה בין אם זה []A או A*...
לא הרסת לי שום אשליה...
אולי פעם הבאה...
 

nocgod

New member
מה שאתה צריך לעשות הוא כזה דבר

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