PDA

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



alimooghashang
جمعه 14 خرداد 1389, 22:55 عصر
با سلام
ببخشید من یه تابع بازگشتی نوشتم در C# ولی درست عمل نمیکنه!
ممکنه توضیح بدید چرا




void Func(Point P)
{
if (P == B)
{
return;
}

if (check(P.X, P.Y - 1))
{
P.Y -= 1;
Func(P);
}

if (check(P.X + 1, P.Y))
{
P.X += 1;
Func(P);
}

if (check(P.X, P.Y + 1))
{
P.Y += 1;
Func(P);
}

if (check(P.X - 1, P.Y))
{
P.X -= 1;
Func(P);
}
}


میره تا یه جایی ولی توقف میکنه!

میلاد قاضی پور
جمعه 14 خرداد 1389, 23:02 عصر
دقیقا کجا ارور داره؟

alimooghashang
جمعه 14 خرداد 1389, 23:08 عصر
ارر نداره
اشتباه انجام میده!
بازگشت نداره
تا یه جایی میره
فکر کنم یه جا یه شرط کم داره که باید چک کنه!
اگر هر یکی از این حالت ها نبود باید چکار کنه؟

ببینید این برنامه باید یک تصویر را بگیره و بصورت عمودی افقی فقط میتونه حرکت کنه! و باید این تصویر را پردازش کنه!
تابع check هم چک میکنه پیکسل مجاورش اگه سفید بود میتونه حرکت کنه!
و هر پیکسل که واردش شد رنگش سیاه میشه که دیگه برنگرده!

mohsensaghafi
شنبه 15 خرداد 1389, 01:57 صبح
سلام دوست عزیز.
شما گفتید که تابع Check چک می کنه اگه پیکسل کناریش سفید باشه حرکت می کنه، ولی اگر تمام اطرافش سیاه باشن چکار باید بکنه. اینجا اونجاییه که برنامه شما گیر می کنه. به یه نقطه ای می رسه که تمام اطرافش سیاه هستن ولی نقطه B نیست.
منطق بازگشتی رو دوباره چک کنید و برای حالتی که گفتم راه حلی پیدا کنید.

alimooghashang
شنبه 15 خرداد 1389, 01:58 صبح
دقیقا
منم به همین نتیجه رسیدم! ولی نمیدونم چه کارش کنم!

ولی خوب نه!
باید از اون جا خارج بشه و به قبل برگرده! به جایی که پیکسل سفید در اطرافش هست! و وجود داره!
اینجاس که برنمیگرده ! و مشکل همینه!

فکر کنم بدونم مشکل از کجاس!
مشکل اینه که آرایه ای که چک روش انجام میگیره پس از هر فراخوانی تابع بازگشتی به حالت قبلیش بر نمیگرده!
من اومدم یه آرایه جدا گرفتم و اطلاعات رو تو اون کپی کردم ولی بازم مشکل داره

hamedsabzian
شنبه 15 خرداد 1389, 02:55 صبح
سلام دوست عزیز.
شما گفتید که تابع Check چک می کنه اگه پیکسل کناریش سفید باشه حرکت می کنه، ولی اگر تمام اطرافش سیاه باشن چکار باید بکنه. اینجا اونجاییه که برنامه شما گیر می کنه. به یه نقطه ای می رسه که تمام اطرافش سیاه هستن ولی نقطه B نیست.
منطق بازگشتی رو دوباره چک کنید و برای حالتی که گفتم راه حلی پیدا کنید.
اگه هیچ کدوم از شرایط برقرار نباشد تابع بازگشت می کند. پس مشکلی پیش نمیاد.

باید از اون جا خارج بشه و به قبل برگرده! به جایی که پیکسل سفید در اطرافش هست! و وجود داره!
شما باید قبل از فراخوانی دوباره تابع نقطه جاری رو سیاه کنید تا دچار مشکل نشه!
(به شرط اینکه توی تابع check رنج آرایه رو کنترل می کنی)
اگه نقطه ی B رنگش سفید باشه، و حتما توی آرایه باشه، حتما به نقطه ی B خواهد رسید.

alimooghashang
شنبه 15 خرداد 1389, 03:00 صبح
ببینید مگه وقتی از تابع بازگشت میکنه نباید مقدار آرایه به مقداری که قبل از ورود به تابع بازگشتی بوده برگرده؟
مگه استک نداریم واسه تابع بازگشتی؟
پس چرا این برنمیگرده!؟

من اینطوری تعریف کردم

Array MyArr;
MyArr = Array.CreateInstance(typeof(Int32), width,height);
for (i = myarr.GetLowerBound(0); i <= myarr.GetUpperBound(0); i++)
for (int j = myarr.GetLowerBound(1); j <= myarr.GetUpperBound(1); j++)
myarr.SetValue(pixelvalue, i, j);

hamedsabzian
شنبه 15 خرداد 1389, 03:33 صبح
با Array این برخورد نمیشه!
تست کردم! مقدارش برنمی گرده. مثل اشاره گرها توی C.
پس بهتر همون طور که گفتم قبل از فراخونی دوباره تابع نقطه جاری رو سیاه کنید و دقیقا در خط آخر تابع، نقطه جاری رو سفید کنید!
حل خواهد شد.

alimooghashang
شنبه 15 خرداد 1389, 12:45 عصر
بله منم به همین نتیجه رسیدم که شبیه اشاره گر کار میکنه
ولی منظورتون رو هم نفهمیدم
میشه واضح تر بگید؟
متغیر رو نمیشه به صورتی گرفت که اشاره گر نباشه

mohsensaghafi
شنبه 15 خرداد 1389, 12:51 عصر
اگه هیچ کدوم از شرایط برقرار نباشد تابع بازگشت می کند. پس مشکلی پیش نمیاد.

شما باید قبل از فراخوانی دوباره تابع نقطه جاری رو سیاه کنید تا دچار مشکل نشه!
(به شرط اینکه توی تابع check رنج آرایه رو کنترل می کنی)
اگه نقطه ی B رنگش سفید باشه، و حتما توی آرایه باشه، حتما به نقطه ی B خواهد رسید.

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

shahriar_1363
یک شنبه 28 شهریور 1389, 15:29 عصر
سلام خدمت دوستان


public int mul(int x, int y)
{
if (y == 1) return x;
else if(y>0) return mul(x, y - 1);
}


همونطور که می بینید یه تابع بازگشتی ساده هستش من می خوام قبل return کردن بررسی کنم بعد بفرستم ولی error می گیره
متن error هم بصورت زیر هستش
not all code paths return a value
چطور می تونم این کار رو انجام بدم