الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

ممكن لا هنتوآ شرح في الركيرجن

بدأه فوضوية في 28 مايو 2011 · 13 رد · 943 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ..

انا هذا الكود سويت تريس عليه وطلع الآوت بوت معي 12 لكن لما جربيته في الكومبايلر طلع 9

ممكن اعرف ايش الصح ؟

#include<iostream>
using namespace std;

int f(int x)
{
if(x>2)

return x + f(--x);
else
return 0;
}
int main()
{
	cout<<f(5)<<endl;
  return 0;
}
#2

الدالة f تعمل بالشكل التالي :

f(5)=4+f(4)
f(4)=3+f(3)
f(3)=2+f(2)
f(2)=0
=> f(5)=0+2+3+4=9

يمكننا كتابة الكود بشكل آخر (أكثر أناقة :) ) :

#include<iostream.h>
int f(int x)
{
	 if(x-->2) return x + f(x);
	 else return 0;
}
int main()
{
	 cout<<f(5)<<endl;
	 return 0;
}

بالتوفيق.

تم تعديل هذه المشاركة بواسطة أحمد المتألق في 28 مايو 2011 في 15:43

1
#3
أحمد المتألق كتب:

الدالة f تعمل بالشكل التالي :

f(5)=4+f(4)
f(4)=3+f(3)
f(3)=2+f(2)
f(2)=0
=> f(5)=0+2+3+4=9

لیس دائما!

ربما یکون کما قالت الأخت (فی بعض compilers )

لأن هذا هو undefined behaviour.

و لیس sequence point فی +

مثلا:

b= ++a + a;

ما هی النتیجة ان کان فی البدایة a=2 ؟

لا نعلم!

ربما 5 ربما 6

أطیب تحیة

تم تعديل هذه المشاركة بواسطة C77431 في 28 مايو 2011 في 15:55

#4
اقتباس
لیس دائما!

ربما یکون کما قالت الأخت (فی بعض compilers )

لأن هذا هو undefined behaviour.

و لیس sequence point فی +

نعم أخي, لذلك قمت بتغيير شكل الكود حتى نتخطى عقبة الـ undefined behaviour دون إدراجها في لائحة المصطلحات حتى لا تتعقد المسألة (خصوصا و أن الأخت مبتدئة :))

أذكر أنه تم نقاش هذا الموضوع سابقا, راجع هذه المشاركة :

ما تقسيركم لهذا التصرف

بالتوفيق.

#5
f(5)=4+f(4)
f(4)=3+f(3)
f(3)=2+f(2)
f(2)=0
=> f(5)=0+2+3+4=9

لمآذآ بدأت بالـ 4 ؟؟؟

لمآذآ لم يكون هكذآ

f(5)=5+f(4)
f(4)=4+f(3)
f(3)=3+f(2)
f(2)=0
=> f(5)=0+2+3+4=9

وكيف جمعت الرقم 2 بالرغم من أن الشرط لم يتحقق

int f(int x)
{
if(x>2)

return x + f(--x);
else
return 0;
}

f(5)=5+f(4)
f(4)=4+f(3)
f(3)=3+f(2)
f(2)=0
=> f(5)=0+3+4+5=12

<~ تصحيح :$

#6
اقتباس
لمآذآ بدأت بالـ 4 ؟؟؟

ألم تفهمي القصة بعد !؟

يوجد خطأ بالدالة المكتوبة, لذلك تسلسل الأحداث لن يجري كما هي العادة ..!!.. قيمة x تغيرت مرتين في أمر واحد, هل سنعتمد على القيمة الجديدة لـ x أم القديمة ؟, هنا تقع المشكلة .. لكن لا عليك, خذي هذا الكود الذي يريحك من متاعب الـ undefined behaviour

#include<iostream.h>
int f(int x)
{
	 if(x-->2) return x + f(x);
	 else return 0;
}
int main()
{
	 cout<<f(5)<<endl;
	 return 0;
}

بالتوفيق.

1
#7

الداله f الحاليه هي نفسها التاليه:

#include<iostream>
using namespace std;

int f(int x)
{
if(x>2)

return x + f(x -= 1);
else
return 0;
}
int main()
{
        cout<<f(5)<<endl;
  return 0;
}

كود هذه الداله لا يحتوي على undefined behavior و السبب فى ان النتيجه هي 9 و ليست 12 يعود لترتيب تنفيذ العمليه الحسابيه، حيث إستدعاء الداله f له اولويه اعلي من عملية الجمع لذا يتم تنفيذ الجزء الخاص به اولا و تنفيذ ذلك الجزء يتطلب تنفيذ عملية حسابيه اخرى و هي x-- (أو x -= 1) و لكن x هو نفس العنصر الذى يتم الجمع عليه لذا عندما يتم تقليل قيمته قبل تمريرها للداله فإنه سوف يحتفظ بتلك القيمه حتى بعد الرجوع من الداله لذا تكون عملية الإستدعاء تأخذ الشكل التالي:

1- x = 5
    is x > 2 true
    return x + f(--x)
    --x = 4
    return 4 + f(4)
    return 4 + 5

2- x = 4
    is x > 2 true
    return x + f(--x)
    --x = 3
    return 3 + f(3)
    return 3 + 2

3- x = 3
    is x > 2 true
    return x + f(--x)
    --x = 2
    return 2 + f(2)
    return 2 + 0

4- x = 2
    is x > 2 false
    return 0

لحل هذه المشكله نحتاج لإنشاء متغير يحمل قيمة x قبل تمريرها للداله f و نقوم بالجمع عليه فى النهايه، و بالتالي تصبح الداله كالتالي:

#include<iostream>
using namespace std;

int f(int x)
{
    int temp = x;

    if(x > 2) return  temp + f( --x );

    return 0;
}

int main()
{
    cout << f(5) << endl;
    return 0;
}

نتيجة التنفيذ للداله الجديده هي 12.

و الله ولي التوفيق

تم تعديل هذه المشاركة بواسطة محمد علاء الدين في 29 مايو 2011 في 01:16

1

مدونتي: C++ Tips and Tricks

#8

آخي (آحمد)

انا لآ آريد منك تغير آلكود , كل مآفي الآمر دخلت آختبآر آلكتروني وصآدفتي هذا الكود ولم يكن من ضمن آلخيآرآت رقم (9) ,,

آخي (محمد علاء)

الكود آلذي قمت بكتآبته هو نفسه مآ آريد شرحه , لكن آلفرق هو آنك وضفت متغير يحمل قيمه x

#9

شکرا للأخ محمد علاء الدین للتصحیح

فوضوية كتب:

آخي (محمد علاء)

الكود آلذي قمت بكتآبته هو نفسه مآ آريد شرحه , لكن آلفرق هو آنك وضفت متغير يحمل قيمه x

الکود الذی قام بکتابته، لیس نفس کودک، کودک نتجیته هی 9 و کود الأخ نتیجته هی 12

شرح الاستاذ علاء الدین کان کامل،

بالاختصار، هنا:

x + f(--x)

الدالة f لها اولویة أعلی من + ، لذا اولا یتم تنفیذ الدالة و ثم جمع نتیجتها مع x ، لکن قیمة x تم تغییرها سابقا فی الدالة (x-- ) ،

و فی النهایة النتیجة هی 9

ان فی الاختبار ما کان عدد 9 ضمن الخیارات ، فالخطأ من الاختبار و لا هذا الکود.

أطیب تحیة

1
#10
x + f(--x)

طيب آخي بمآ آن الآوليه في الـ f

كيف اذآ تغير النآتج في آلكود آللي كتبه آلآخ (محمد) , ب آلرغم آن كل مآ قآم به هو آنه آضآف متغير وجعل قيمته هو الآكس

#11

temp یحفظ قیمة x قبل ان یتم تنقیصها.

#12

طيب هو جمع الـ temp

 temp + f( --x );
#13

توجد طريقه اسهل لحل هذه المشكله و لا اعرف كيف غابت عني، لا داعي من استخدم decrement operator يمكن طرح واحد فقط و بالتالي تصبح الداله كالتالي:

#include<iostream>
using namespace std;

int f(int x)
{
    if(x > 2) return  x + f( x - 1 );

    return 0;
}

int main()
{
    cout << f(5) << endl;
    return 0;
}

نتيجة الكود السابق هي 12 ايضا.

و الله ولي التوفيق

مدونتي: C++ Tips and Tricks

#14

:blink: جزاكم الله عنا كل خير

Celebrity-Image-Albert-Einstein--Religion--332121.jpgAlbert%20Einstein%20copy.jpg

البرت انينشتين

مواضيع مشابهة