רקורסיה

erez2010

New member
רקורסיה

שלום רב אני מנסה לפתור משהו ואני לא מבין אותו התכנית היא כזאת
int func_A(int mat[][N],int n)
{
int i;
int num;
num=mat[n][n];
if(n==N)return (num);
else
for(i=n+1;i<N;i++)
num-=(mat[n]+mat[n]);
return (num+func_A(mat,++n));
}

int main()
{

int mat[N][N]={{10,1,1,1,1},{1,10,1,1,1},{1,1,10,1,1},{1,1,1,12,2},{1,1,5,1,11}};
int res=0;
res=func_A(mat,0);
printf("res=%d\n",res);

עכשיו שאני מריץ את התכנה כל פעם יש לי ערך שונה של res אני לא מבין למה הוא אמור להיות ערך מסויים קבוע
עוד שאלה רק שאני יבין כאשר יש קריאה רקורסיבית של ((return(num+(mat,++n בעצם אני מבין שהפונקצייה חוזרת פחות n אבל איך הnum משתלב פה איפה הוא נכנס למה אני בעצם מחבר אותו איך הוא מוחזר אם בכלל
בבקשה אם תוכלו לפרט לי שאני מבין אני מאוד אודה לכם תודה רבה רבה
 

ihovav

New member
בשביל התחלה - תיישר קוד לשמאל...

int func_A(int mat[][N],int n)
{
int i;
int num;
num=mat[n][n];
if(n==N)return (num);
else
for(i=n+1;i<N;i++)
num-=(mat[n]+mat[n]);
return (num+func_A(mat,++n));
}

int main()
{

int mat[N][N]={{10,1,1,1,1},{1,10,1,1,1},{1,1,10,1,1},{1,1,1,12,2},{1,1,5,1,11}};
int res=0;
res=func_A(mat,0);
printf("res=%d\n",res);
 
הקוד שגוי

כל פעם הפונקציה נקראת עם n יותר גדול, עד (ועד בכלל) שהיא נקראת עם n=N.
הפונקציה ניגשת לתא mat[n][n]zzz, שבקריאה האחרונה הוא mat[N][N]zz, כלומר, מחוץ לגבולות המערך.
(יכול להיות שבתנאי העצירה אמור להיות N-1?)
קריאה מחוץ לגבולות המערך זה undefined behavior, ולכן כל פעם יש לך תוצאה שונה.

לשאלה השניה: אתה מחבר את num לפלט של הקריאה הפנימית, ומחזיר את התוצאה.

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