سلام
من برای بالا بردن مهارتم در برنامه نویسی دارم تمرین های مختلفی رو حل می کنم که یکی از مابع من کتاب جعفرنژاد هست . تو صفحه 93 این کتاب یک تمرین وجود داره که الگوریتم اصلا سختی نداره ولی من یکم با نحوه نوشتن اون می خوام با دوستان هم فکری کنم .
متن تمرین به این شرح است : برنامه ای که دو عدد صحیح مثبت را از ورودی خوانده ، حاصلضرب آن را با استفاده از جمع محاسبه کنید .
خوب من عموما قبل اینکه پاسخ رو بخونم این کد رو خودم نوشتم (با توجه به این که فصل بیشتر در مورد تابع بازگشت هست باید برنامه با تابع بازگشت نوشته بشه ) :
# include <iostream.h>
# include <conio.h>

int mul (int a , int b ){
static int result = 0 ;
if (b == 0 )
return result ;
else{
result += a;
return mul (a , b-1);
}
}
int main () {
int a , b ;
cin >> a >> b ;
cout << mul (a , b);
getch ();
return 0;
}
توضیح : متغیر static int result برای b بار جمع شدن a با خودش است و برای جلوگیری از مقدار گیری دوباره static تعریف شده.شرط پایان دهنده صفر شدن b می باشد.

خروجی کد من کاملا درست بود ولی وقتی کتاب جعفر نژاد رو نگاه کردم به یه نکته جالب برخورد کردم . کد پاسخ به این صورت بود :
# include <iostream.h>
# include <conio.h>

int product (int x , int y ){
if (y == 1)
return x ;
return (x + product(x , y-1));
}
int main () {
int x , y ;
clrscr();
cout << "Please enter two integer numbers .";
cin >> x >> y ;
cout << "Their product is : " << product (x , y);
getch ();
return 0;
}
خوب خروجی این کد هم درست بود ولی به فراخوانی ها نگاه کنید(x = 4 و y = 3 ) :
فراخوانی اول :
if (3 == 1)
return 4 ;
return (4 + product(4 , 3-1));
فراخوانی دوم :
if (2 == 1)
return 4 ;
return (4 + product(4 , 2-1));
فراخوانی سوم :
if (1 == 1)
return 4 ;
return (4 + product(4 , 1-1));
نگاه کنید توی فراخوانی سوم شرطمون ارضا میشه یعنی 1 == 1 پس مقدار return 4 درست هست . حالا سوال من اینه که وقتی یک return در یک خط بالاتر وجود داره return بعدی یا در حالتی کلی return های بعدی skip میشن ؟ چرا توی فرراخوانی سوم product(4 , 1-1) اجرا نمیشه ؟
ممنون
سرافراز باشید