PDA

View Full Version : خروجی رویه بازگشتی از یک لیست پیوندی یکطرفه



Joyebright
چهارشنبه 13 دی 1391, 22:28 عصر
خروجی رویه بازگشتی what برای لیست پیوندی یک طرفه (A,B,C) که ابتدا A و بعد B و در انتها C است چیست؟


void what(ListNode * L){
if(L!=NULL) then{
what(L->next);
cout<<L->info;
what(L->next);
cout<<L->info;
}
}

دوستان لطفاٌ خروجی را با توضیج ذکر کنید پیشاپیش متشکرم

hadi0x7c7
پنج شنبه 14 دی 1391, 01:05 صبح
خروجی میشه :

3 3 2 3 3 2 1 3 3 2 3 3 2 1

شما اگه یه اینجور چیزی رو کاغذ بسازی کللا میفهمی چی شده:


|- F(B)
|
|-PRINT A
F(A)|
|-F(B)
|
|-PRINT A

اوبالیت به بو
پنج شنبه 14 دی 1391, 13:20 عصر
درود

جناب hadi0x7c7 (http://barnamenevis.org/member.php?248784-hadi0x7c7) من متوجه نشدم.

وقتی به what(L->next); اول می رسیم تابع دوباره فراخوانی میشه (یعنی در اون لحظه A به استک می ره تا بعدا اجرا بشه) بعد next صورت می گیره یعنی B و همین اتفاق برای B و وقتی B هم next رو صدا می زنه نوبت به C می رسه که در این صورت شرط if نقص میشه چون c = Null چون آخر لیست هست... کی نوبت به 3 دستور بعدی می رسه؟

hadi0x7c7
پنج شنبه 14 دی 1391, 19:57 عصر
من این برنامه رو با جاوا نوشتم دستی هم تریس کردم به یک نتیجه رسیدم.

اینم call tree: البته اگه درست باشه !

f(a)
f(b)
f(c)
f(null)
print c
f(c)
f(null)
print c
print b
f(c)
f(null)
print c
f(c)
f(null)
print c
print b
print a
f(b)
f(c)
f(null)
print c
f(c)
f(null)
print c
print b
f(c)
f(null)
print c
f(c)
f(null)
print c
print b
print a

Joyebright
پنج شنبه 14 دی 1391, 20:39 عصر
درود

جناب hadi0x7c7 (http://barnamenevis.org/member.php?248784-hadi0x7c7) من متوجه نشدم.

وقتی به what(L->next); اول می رسیم تابع دوباره فراخوانی میشه (یعنی در اون لحظه A به استک می ره تا بعدا اجرا بشه) بعد next صورت می گیره یعنی B و همین اتفاق برای B و وقتی B هم next رو صدا می زنه نوبت به C می رسه که در این صورت شرط if نقص میشه چون c = Null چون آخر لیست هست... کی نوبت به 3 دستور بعدی می رسه؟

منم دقیقاٌ هیمن مشکلو دارم هنوزم کامل متوجه نشدم !

Joyebright
پنج شنبه 14 دی 1391, 20:41 عصر
خروجی میشه :

3 3 2 3 3 2 1 3 3 2 3 3 2 1

شما اگه یه اینجور چیزی رو کاغذ بسازی کللا میفهمی چی شده:


|- F(B)
|
|-PRINT A
F(A)|
|-F(B)
|
|-PRINT A
جوابتون کاملاٌ درست هستش اما این چیزی که شما گفتی رو کاغذ پیاده کنم نوبت به C کی میرسه؟

hadi0x7c7
پنج شنبه 14 دی 1391, 21:16 عصر
ن c = Null چون آخر لیست هست... کی نوبت به 3 دستور بعدی می رسهوقتی به null برسیم دیگه تابع اجرا نمیشه و برمیگرده به دستور بعد از اخرین صدا زدن که اینجا میشه cout << l->data
اگه شما به درخت پست شماره 4 دقت کنی متوجه میشی.