PDA

View Full Version : سوال: کمک در مورد تابع بازگشتی



M0TR!X
پنج شنبه 23 دی 1389, 10:03 صبح
سلام.

بچه ها من یه برنامه میخوام که x,y رو از ورودی بگیر و x/y بکنه با استفاده از تابع بازگشتی ! سواله خیلی ساده ایه ولی اصلا اجرا نمیشه :d

خودم به این صورت نوشتم جواب نداد !
return x/tagsim(y,y=0)


اگه میبینید توی return x/tagsim(y,y=0) متغییر y رو مساوی صفر گذاشتم به خاطر اینکه که میخواستم x/y بشه بعد y=0 بشه و دیگه تابع ادامه پیدا نکنه !

اسم تابع مت tagsim و شرط اول هم if (x==0 ||y==0)

مرسی

quiet_programmer
پنج شنبه 23 دی 1389, 12:27 عصر
با سلام.

روشی که من کد کردم اینه که تقسیم رو با استفاده از تفریق و به صورت بازگشتی انجام میده.


#include <iostream.h>
int Div(int x,int y)
{
if (x>=y)
{
return Div(x-y,y)+1;
}
else
return 0;
}
void main()
{
int x;
int y;
cin>>x;
cin>>y;
cout<<Div(x,y);
}

فقط نکته ای که هست این برنامه فقط خارج قسمت صحیح رو بر میگردونه البته قابلیت نشون دادن باقی مانده رو هم داره به شرطی که داخل تابع Div بعد تو قسمت else قبل از دستور return 0 دستور نمایش x رو بدی که همون باقی مونده x/yه. البته میتونی یکی از پارامترهای تابع رو به صورت ByRef ارسال کنی و x رو داخل اون قرار بدی که در این صورت دستور نمایش یا عدم نمایش باقی مانده تو قسمت main مشخص میشه.

موفق باشی.

M0TR!X
پنج شنبه 23 دی 1389, 19:43 عصر
سلام.

واقعا ممنون ! فک کنم منظور استادمون همین بوده من اشتباهی مستقیم تقسیم میکردم ! البته با خودم گفتم چه دلیل داره اگه قرار یه بار تقسیم بشه با تابع بازگشتی نوشت !


فقط یه تیکه شو کامل متوجه نشدم ! x-y میشه بعد یه y گذاشتی چه اتفاقی برای این y میوفته ؟ اگه نباشه چی میشه ؟


به برنامه دیگه هست x^y اینم میشه با همین روش نوشت ! واقعا ممنون !

quiet_programmer
پنج شنبه 23 دی 1389, 20:30 عصر
y درواقع هیچ کاری رو انجام نمیده. اما حتما باید به تابع ارسال بشه. یا به صورت سراسری تعریف بشه تا نیازی به ارسال به تابع رو نداشته باشیم ولی توصیه نمیشه.

روش کار برنامه رو هم توضیح میدم تا شاید کمکت کنه.

فرض کنیم عدد 8 رو میخوایم به 3 تقسیم کنیم. برای اینکار از 8 سه تا کم میکنیم باقی مانده برابر 5 میشه(یکبار تفریق) دوباره 3 تا از 5 کم میکنیم باقی مانده برابر 2 میشه (دوتا تفریق) دیگه نمیشه از 2 سه تا کم کنیم پس تقسیم تموم شد. برای بدست آوردن خارج قسمت تعداد تفریقها رو میشموریم که شد دوتا. پس خارج قسمت 2. باقی مانده هم آخرین عددی که کوچکتر از yه که از تفریق X-Y باقی مونده.

توان رو هم میشه به صورت بازگشتی با عملگر جمع نوشت.
یه کم کارکنی میتونی بنویسی. ولی اگه نتونستی یا به مشکل برخوردی بگو تا اگه سوادم قد داد کمکت کنم.

M0TR!X
چهارشنبه 29 دی 1389, 01:31 صبح
سلام.

اگه بگن x%y رو با بازگشتی بنویسید چطور میشه ؟ :D

quiet_programmer
چهارشنبه 29 دی 1389, 12:43 عصر
سلام.

گفته بودم که:بامزه:

باشه دوباره میگم. یه روش همونه قبلا بهش اشاره کردم. یعنی هم میتونی X/Y وهم X%Y رو با تابع بالا محاسبه کنی. با گذاشتن دستور نمایش X تو تابع Div تو قسمت else قبل از دستور Return 0 البته میدونی که این دوتا دستور یعنی cout<<x و return 0 بایستی تو براکت قرار بگیرن:لبخند:

ولی اگه میخوای تابعی داشته باشی که فقط X%Y رو برگردونه کد رو به صورت زیر تغییر بده


#include <iostream.h>
int Div(int x,int y)
{
if (x>=y)
{
return Div(x-y,y);
}
else
return x;
}
void main()
{
int x;
int y;
cin>>x;
cin>>y;
cout<<Div(x,y);
}

M0TR!X
چهارشنبه 29 دی 1389, 15:42 عصر
سلام.

راست میگی گفته بودی !

فرقش اینکه یه +1 توی x/y بود که توی این نیست و اصل کاری هم انه چون تعداد تقسیم ها رو میشماره !

مرسی :x

Salar Ashgi
شنبه 02 بهمن 1389, 10:50 صبح
در تکمیل گفته ها ، همواره در نوشتن توابع بازگشتی یک قانون کلی بر مساله ما حاکم است ، در این مساله هم قانون کلی زیر وجود دارد :

65379

و نوشتن تابع بازگشتی از روی این قانون انجام میشود .
برای نوشتن تابع بازگشتی جهت انجام هر 4 عمل اصلی ، مثل قانون ذکر شده ، میتوان قوانینی مطرح کرد .

موفق باشید ./