האם אפשר לעשות את זה?

avinamal

New member
האם אפשר לעשות את זה?

לכתוב פונקציה *רקורסיבית* ב C, המקבלת *רק* מצביעים לשני מערכים A,B ואת אורכם N, ומשימה במערך B את הסכום המצטבר של איברים מהמערך A - ללא שינוי ערכים במערך A. ללא מעטפת, ללא משתנים גלובליים. * כן, זו שאלה משיעורי בית.
 

immortalus

New member
הערך המצטבר הכוונה היא לסכום מ-0 ועד i?

כן, אפשר.. לא, לא יותר מדי מסובך. אתה שולט באורך, ואתה שולט ע"י אריתמטיקת מצביעים על האיבר הראשון שאתה מכניס... האיבר ה-i במערך B הוא B[i-1]+ A ומכאן שלא צריך גם לולאות... רמז: תנאי העצירה שלך צריך להיות length == 0... בהצלחה!
 

avinamal

New member
כן, הסתדרתי ../images/Emo163.gif

לקיתי בדיסלקציית רקורסיה זמנית. תודה.
 

e s a l

New member
הוא לא אמר אבל שהפונקציה מקבל רק את מערכים

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

HaifaMan

New member
איך אתה עושה את זה?

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

avinamal

New member
עשיתי ככה:

void cumsum(int *a, int *b, int n) { if (1 == n) b[0] = a[0]; else cumsum(a, b, n-1); b[n] = b[n-1] + a[n]; return; }​
עובד.
 

HaifaMan

New member
פשוט וקל :)

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

shirbi

New member
איך עובד?

לדוגמה, אם N = 2, אז אתה מכניס ערכים לתא מספר 2 במערך B, למרות שהאינדקסים התקפים בו הם רק 0 ו 1. זו דריסת זיכרון!
 

HaifaMan

New member
לא שמתי לב לנקודה הזו בכלל

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