PDA

View Full Version : تابع بازگشتی



Gold_cpp
چهارشنبه 21 مهر 1389, 08:27 صبح
سلام به همه
قطعه کد زیر توی کامپایلر ها چطوری کامپایل میشه .:عصبانی++:


void subset(int n,int i)// n = 3 , i = 0
{
if (i==n)
{
printsubset(n);
return;
}
flag[i]=1;
subset(n,i+1);
flag[i]=0;
subset(n,i+1);
}


این کد برای نوشتن زیر مجموعه یک مجموعه استفاده می شود . (power set)

اینطوری که من تحلیل کردم


flag[i]=0;
subset(n,i+1);
}

اصلا نباید تکرار بشه .
چون توی subset اولی خودشو فراخونی می کنه .
ولی وقتی خط به خط اجرا میکنم . انگاری واقعیت یه چیز دیگست . :متفکر:
بحث من سر همین چهار تا خطه .


flag[i]=1;
subset(n,i+1);
flag[i]=0;
subset(n,i+1);

اشتباه من چیه ؟:افسرده:
لطفا راهنمایی کنید.

Salar Ashgi
چهارشنبه 21 مهر 1389, 15:29 عصر
ببینید ، رمز حل و تفسیر الگوریتم های بازگشتی ، شروع از یه حالت مساله با سایز کوچک مثل Base Case
و رسیدن به حالت Recursive Case میباشد ، در مورد مساله شما هم تابع بازگشتی دوبار خودش را فراخوانی
کرده که ممکنه زیر حالات زیادی تولید کنه و درخت بازگشت عمقش بیشتر بشه ، ولی خوب اگه از روشی
که گفتم برید ، منطق برنامه را بخوبی فرا می گیرید ./

Gold_cpp
چهارشنبه 21 مهر 1389, 15:57 عصر
سلام
توی قطعه کد دو بار


subset(n,i+1);

یکار رفته
برنامه که خط به خط اجرا میشه .
وقتی به
subset(n,i+1); اولی میرسه طبیعتا (!) نباید به subsetدومی یرسه .
علت اجرا شدن دومی رو متوجه نمی شم لطفا بیشتر توضیح بدید .
:لبخندساده: