ספירת מספר צמתים בעץ לא בינארי

אנחה

New member
ספירת מספר צמתים בעץ לא בינארי

(פורסם גם בפורום דוט נט) כאשר מדובר בפונקציה רקורסיבית לספירת צמתים בעץ בינארי, זה פשוט : אם אין ילדים => תחזיר 1, אחרת, תחזיר 1+קריאה רקורביסית לבן ימין+קריאה רקורסיבית לבן שמאל. אך כאשר מדובר בעץ שיכולים להיות לכל צומת יותר מ 2 ילדים ? הפתרון שמצאתי (מבלי להשתמש במשתנה גלובלי), הוא במקום שהפונקציה תחזיר מספר, היא לא מחזירה כלום, אלא מקבלת בחתימת הפונקציה את המשתנה שבסוף יחזיק את התוצאה, לרוץ בלולאה על כל הבנים, ועבור כל בן, להעלות את המונה, ולבצע קריאה רקורסיבית. עובד, אבל האם יש פתרון יפה יותר, כך שהפונקציה לא תקבל בחתימתה את המונה, אלא תחזיר את התוצאה כ return value ?
 

user33

New member
לדעתי מאוד פשוט

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

אנחה

New member
נסה ותראה שאי אפשר ../images/Emo13.gif

כשזה בינארי, את היכול לעשות : 1+XXLeft+XXRight כשאתה צריך לרוץ בלולאה, אתה כבר לא יכול לבטא את הסכום הכולל במשוואה.
 

vinney

Well-known member
איזו משוואה?

הסכום הוא
∑ƒ(i) + 1​
כשi כמובן זה מספר הבן של הצומת, ורץ תחת סיגמא מ0 לכמה שיש בנים. f זה הפונקציה שלך, 1 זה הצומת עצמה.
 

אנחה

New member
אתה מבין בכלל את השאלה ?

לא מדובר בקושי ביטוי מתמטי, אלא תרגומו לקוד.
 

vinney

Well-known member
הא, אז לא הבנתי איך התשובה

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

אנחה

New member
מה שנכתב ע"י user33 זה בדיוק מה שאני כתבתי

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

vinney

Well-known member
לא רואה שום בעיה

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

vinney

Well-known member
../images/Emo13.gif

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

vinney

Well-known member
אז מה הבעיה שלך? הקוד?

תעלי את הקוד - נפתור ביחד. מה את רוצה?
 

אנחה

New member
בדיוק מה שכתוב בהודעה הפותחת.

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

vinney

Well-known member
שמעי, עצלנות זה מחלה כרונית

בקיצור את מחפשת שמישהו יעשה לך את העבודה. 'צטערת, לא יקרה פה כנראה.
 

אנחה

New member
עדיף מטיפשות.

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

user33

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

יש כאן מספר מתכנתים מנוסים שנמצאים קצת יותר מיומיים בפורום. כולם הבינו את הפתרון שלי שהוא המובן מאליו. רק את (סטודנטית? תלמידה?) לא מבינה את הפתרון אז אצל מי את חושבת נמצאת הבעיה? ולגופו של עניין: כדי לסכום את הבנים צריך לאפס מונה x = 0 לעשות לולאת for לפי מספר הילדים ופשוט בתוך הלולאה: x = x+func(child לאחר סיום הלולאה להחזיר את x. אני לא יכול לחשוב על דרך יותר פשוטה ובהירה להסביר את זה...
 

אנחה

New member
כפי שאמרתי...

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

user33

New member
לא עובד = עשית טעות

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

אנחה

New member
אתה צריך תרגום של עברית מבנית לקוד ?

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