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

amir139

New member
היי,יש לי בעיה לזכור אחגוריתמים של רקורסיה

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

amir139

New member
באיזה דרך ניתן לבצע

בעץ בינרי החלפת שורש מקומי אם העלה השמאלי שלו ב JAVA אני יכול להחליף את הנותנים של כל אחד מהם אבל אני חושב שמתכוונים להחלפה פיסית של איברים בעץ
 

vinney

Well-known member
בדיוק אותו דבר

node temp; temp = tree.node1; tree.node1 = tree.node2; tree.node2 = temp;​
למה כזה דבר לא טוב לך?
 

generala

New member
אין מה לזכור בע"פ

ככה לא לומדים ! רקורסיה בנויה (בניגוד לצבא) מ-2 חלקים. 1) בהתחלה תנאי העצירה שלה (יירשם בתחילת השיטה \ פונק'). 2) בגוף תירשם הרקורסיה עצמה עפ"י העיקרון של: אני איטרציה בודדה (מלשון יחידנות) ועצלנית, אני לא יודעת בגדול לעשות כלום, אבל אם תביאו לי את XXX (המוצר הכמעט מושלם) אני אעשה עליו את הפעולה הבודדה שלי לסיומו. = אתה רושם את הפעולה הזו *כקריאה לשיטה \ פונק' עצמה* כי היא מורכבת מהרבה רקורסיות "עצלניות" שכאלו... וזה ממש על קצה המזלג...
 

amir139

New member
ניסיתי להבין את הרקורסיה של subsets

זה הקוד // print all subsets of 1...n Public static void subsets(int n, String andAlso) { if (n==0) { System.out.println(andAlso); } else { subsets(n-1,andAlso + n); subsets(n-1,andAlso); } } http://img185.imageshack.us/my.php?image=img8290nf7.jpg הייתי אמור לקבל משהוא בסגנון הזה cd bd bc ad ac ab כזה לפחות כתוב בהרצאה שלנו אבל כשעשיתי תרשים
 

vinney

Well-known member
שני דברים

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

amir139

New member
שאלה בבנייה של רקורסיה

הגדרה – פירוק של מספר טבעי הינו סדרה לא עולה של מספרים טבעיים שסכומם n. לדוגמא הפירוקים של המספר 4: 4 1 3 2 2 12 1 1 1 1 1 הפונקציה public static void partitions (int n) מדפיסה את כל הפירוקים של מספר טבעי n והינה מוגדרת בעזרת הפונקציה הרקוסיבית הבאה שעליכם לתכנן ולכתוב. Public static void partitions(int n, int m, String prefix) תפקידה של השיטה הוא להדפיס את כל אותם הפירוקים של המספר הטבעי n. אשר בהם המספר הגדול ביותר הינו לכל היותר max כאשר לפני כל פירוק מודפסת המחרוזת prefix. רמז: שימו לב שניתן לחלק את הפירוקים של המספר 4 לקבוצות על פי המספר הראשון מסדרת הפירוק. דהיינו לפי אלו שמתחילים ב-4, 3, 2, 1 Public static void partitions (int n) { partitions (n, n, ""); } Public static void partitions (int n, int max, String prefix) { הסבירו כיצד תתכננו פונקציה זו והשלימו את קוד התוכנית
 

amir139

New member
זה הפתרון אבל

אני רגיל לראות היגיון בדברים פהכשאני רואה רק קוד אני יכול להציב בזה מספרים ולראות שזה אכן עובד אבל זו היתה שאלה במבחן בjava אני לא יודע איך להגיע לקוד הזה???????? [ zzzzz[code Public static void partitions (int n) { partitions (n, n, ""); } Public static void partitions (int n, int max, String prefix) { if(n==0) { System.out.println(prefix); } else { for(int i= Math.min(n,max); i>=1, i--) { partitions (n-i, i, prefix+" "+i); zzz } } } [/code] zz
 

vinney

Well-known member
תגיד, מה לא היה ברור?

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

amir139

New member
זה הקוד אם התגיות :)

Public static void partitions (int n) { partitions (n, n, ""); } Public static void partitions (int n, int max, String prefix) { if(n==0) { System.out.println(prefix); } else { for(int i= Math.min(n,max); i>=1, i--) { partitions (n-i, i, prefix+" "+i); } } }​
 
למעלה