بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته
كنت أسبح يوما في بحور الإنترنت ..
و صادفت مبرمجا أعجبني قوله و عمله ..
فسرعان ما تعرفت به و دارت بيني و بينه محادثة طويلة على الماسنجر ..
و كان يعمل باحثا في شركة CheckPoint المتعاقدة مع شركة Kaspersky Lab
الشركة الروسية ذات مضاد الفيروسات الشهير ..
سألته عن كيفية وصوله لهذه المكانة العلمية في البرمجة ..
و ماذا علي أن أفعل كي أكون مثله ..
قال لي سأختبرك في سؤال بسيط جدا في البرمجة ..
و منه ستغير مسار حياتك البرمجية ..
فقررت أن أنقل لكم هذا الحوار بعد أن ترجمته للعربية:
هو : بتعرف ال factorial of a number ؟؟
أنا : طبعا .. فمثلا ال factorial للرقم تسعة هو 9*8*7*6*5*4*3*2*1 و ال factorial ل4 هو 4*3*2*1 و هكذا ...
هو : مية مية كلامك !
عندي متغيرا نوعه Integer و اسمه مثلا Input واريد منك الان ان تكتب لي كود code ، يجيب لي ال factorial الخاص به ..
بس خلي الكود code تبعك Optimized ..
أنا : فقط هذا هو المطلوب ,, ثواني خليك معاي واكتبلك الكود code
هو : Take Ur Time
و بعد حوالي من دقيقة إلى دقيقتين ..
أنا : تفضل يا عزيزي الكود code:
رمز PHP:
<code style="white-space:nowrap"> <code> int fact(int input)
{
if (input >= 2)
input *= fact(input - 1);
return input;
}
</code> </code>
هو : Recursion ؟
أنا : أي نعم ..
هو : ألا تعرف أن الRecursion لا تمس الOptimizing بشيء!!!
و أنها خطيرة على الذاكرة !!
أنا : بالطبع أعرف ..
هو : اوك اريد منك تكتبلي الكود code بدون Recursion ..
أنا : يعني أعمله loop ؟؟؟
هو : أوك ..
أنا : طيب ثواني خليك معاي ..
أنا : تفضل الكود code ..
رمز PHP:
<code style="white-space:nowrap"> <code> int factorial(int input)
{
if (input <= 2)
return input;
int output = input;
for (int i = input - 1; i >= 2; i--)
{
output *= i;
}
return output;
}
</code> </code>
هو : طيب حلو كثير .. و انت بصراحة عجبتني بإنك عملت عد تنازلي في الloop علشان توفر على البروسيسور الحسابات ..
أنا : هههههه طيب كويس إني عجبتك
هو : طيب يلا نناقش هذا الكود code .. ونحاول نختصره ..
أنا : ممم أوك ناقش يا سيدي ..
وكنت بقول في بالي " هذا الرجل مجنون ولا شو ؟ شو يختصر وما يختصر !!!
يعني لا عاجبه ال Recursion ولا عاجبه الكود code هذا !! هذا واحد فاضي ومو لاقي حدا يتسلى عليه غيري ؟!!! "
هو : انتبه معاي .. انت في الأول كاتب شرط
رمز PHP:
<code style="white-space:nowrap"> <code> if (input <= 2)
return input;
</code> </code>
شو الفائدة منه ؟؟؟
أنا (قلتله و أنا مستغرب) : علشان لو القيمة ب2 أو ب1 أو صفر أو سالبة ترجع زي ما هي ..
هو : طبعا طبعا معاك حق !
لكن هل من الممكن إنك تدمج هذا الشرط مع الloop ؟؟؟
أنا :مش فاهم ,, كيف يعني ؟؟
لو أنا كررت الشرط داخل الloop هكذا انا احمل على البروسيسور عمليات أكثر ..
فكل مرة يكرر الكلام اللي جوه الloop سيتحقق من الشرط !!
هو : أصبر أصبر انت مش فاهم ..
أنا :طيب فهمني ..
هو : تعال نجرب الأرقام التي ينطبق عليها الشرط على الloop
لو الinput يساوي 2 حيكون الInput-1 يساوي 1 .. و ال1 لا ينطبق عليه شرط الloop اللي هو i >= 2
في هذه الحالة الloop لن يتم المرور خلالها ولا مرة !!
و لو جربتها على ال1 و الصفر و الأرقام السالبة ستحصل على نفس النتيجة ..
فما فائدة الشرط من الاساس ؟؟
أنا : تصدق معاك حق !!
بس معلش أنا كتبتها على عجلة من أمري دون أن أحللها ..
هو : مش مشكلة ماهو احنا بنحللها سوا
اكتبلي الكود code من غير الشرط اللي في الأول ..
أنا : الكود code يا سيدي ..
رمز PHP:
<code style="white-space:nowrap"> <code> int output = input;
for (int i = input - 1; i >= 2; i--)
{
output *= i;
}
</code> </code>
هو : تمام ..
بس فيه حاجة .. انت ليه فارض output على شكل Integer مع أنك عندك Input ايضا على شكلة Integer ؟؟
أنا : ههههه علشان الInput يكون فيه الرقم المدخل و الoutput يكون فيه الرقم المخرج ..
أنا محتاجهم هما الإتنين ..
هو : لأ ركز كويس .. انت مش محتاجهم هما الإتنين .. انت ممكن تستغنى عن واحد فيهم !!
أنا : ممممم (بافكر) مممم مممم مممم مممم
طيب يا معلم .. أنا ممكن أكتب الكود code هكذا :
رمز PHP:
<code style="white-space:nowrap"> <code> for (int i = input - 1; i >= 2; i--)
{
input *= i;
}
</code> </code>
هو : حلو كثير يا مبدع .. شفت اختصرنا الكود code كيف ..
أنا : آه بصراحة اختصارك كبير للكود code .. و ده بيوفر كتير على الذاكرة و المعالج .. انت فعلا فنان لأن أنا ما كنت اختصر أكوادي من قبل بهذا الشكل !!
هو : طيب فيه اختصارات تانية ..
أنا : ههههههههه هو عاد فيه كود code يا عم ؟
أختصر إيه بس !!!
هو : شوف يا سيدي انت قايل في شرط الloop أن i >= 2 .. حلل لي هذا الشرط ..
أنا : الأول المعالج بيتأكد إن قيمة i أكبر من 2
ثم بيتأكد إذا كانت قيمة i تساوي 2
هو : الله ينور عليك يا معلم .. هكذا انت عندك عمليتين
طيب ينفع أختصرهم لعملية واحدة ..
أنا : !!!!!!!!! كيف لم تاتني هذه الفكرة !!!!!!!!
طبعا ينفع أقول i > 1 وهذا نظرا لانه عندنا اعداد صحيحة ..
هو : طيب اكتب لي الكود code النهائي علشان نحاول نختصره اكثر ..
أنا :طيب يلا نختصره .. هذا هو الكود code
رمز PHP:
<code style="white-space:nowrap"> <code> for (int i = input - 1; i > 1; i--)
{
input *= i;
}
</code> </code>
هو :كويس ركز معاي ..
الloop متكونة من 3 أجزاء
الجزء الأول و هو int i = input – 1 و بيتكرر مرة واحدة في بداية الloop
و الجزء الثاني و هو i > 1 و هو بيتكرر في بداية كل دورة من الloop
و الجزء الثالث i-- و هو بيتكرر في نهاية كل دورة من الloop
كما أن الجزء الذي بداخل الloop اللي هو input *= i يتكرر بينهما صح ؟؟
أنا : تمام .. أنا عارف هذا الكلام كويس ..
هو : طيب إيه رأيك نضم الجزء اللي داخل الloop إلى الloop نفسها !!!!!
أنا : يا فنان !!! اكيد ما راح نضمه في الجزء اللي بيتكرر في بداية كل دورة ..
راح نضمه في الجزء اللي بيتكرر في نهاية كل دورة اللي هو ال i--
هو : الله ينور عليييييييك إكتب الكود code النهائي
أنا : مممم طيب انا عندي ال i-- تختلف عن ال--i في ان الاولى تحدث بعد اتمام العملية والثانية تحدث اثناء العملية ..
وانا اريد ان اخصم من ال i واجد من بعد ما اضربها في الinput .. مممممم
هو : تمام ,, راح تستخدم من فيهم ؟؟
أنا : طبعا الi-- !!!!!!!!
الكود code النهائي بقى سطر واحد !! يا لهوي !!!!!!!!!!!!!!
هو : الله ينور عليك .. اكتب السطر الذي بقي
أنا : تفضل
رمز PHP:
<code style="white-space:nowrap"> <code> for (int i = input - 1; i > 1; input *= i--) ;
</code> </code>
هو : 100% ما هو رايك في الاختصار ؟؟
تخيل الكود code القديم كيف كان
رمز PHP:
<code style="white-space:nowrap"> <code> int factorial(int input)
{
if (input <= 2)
return input;
int output = input;
for (int i = input - 1; i >= 2; i--)
{
output *= i;
}
return output;
}
</code> </code>
و هذا الكود code الجديد:
رمز PHP:
<code style="white-space:nowrap"> <code> for (int i = input - 1; i > 1; input *= i--) ;
</code> </code>
أنا : الفرق رهيييييييب بين الإتنين !!! بصراحة انت راجل راااااااائع !!! ربنا يزيدك علم يا شيخ !!!
بس يعني أنا لو عندي برنامج كبير و اختصرت كل جزء فيه بهذا الشكل ما راح اخلص !!
هو : كل شيء ياتي بالتدريب .. حاول من اليوم تكتب كل اكوادك مختصرة باكبر اختصار ممكن ..
وبعد الانتهاء من البرنامج تحاول تختصره مرة اخرى ..
وهذا الاختصار مكلوب جدا في برمجة برامج الانتي فايروس..
فتخيل معي لو لم نختصر هذا الكود code الى اقل ما يمكن . راح يعمل scan لجهازك في سنين وسنين !!!
لان كل عملية تتكرر ملايين المرات !!! وكل اختصار بتساويه بتوفر فيه وقت كثير ..
أنا : بصراحة انت رجل لا يوجد مثلك اثنين .. انا اريد فعلا ان اتدرب على هذه الحكاية ..
هو : طبعا طبعا .. وتشوف مستواك بعد فترة ,, راح تزيد من سرعة برمجتك و تضاعف مهاراتك ..
المهم ما رايك بان نختصر هذا الكود code اكثر ؟؟
أنا : أي كود code ؟!
هو : كود code الفاكتوريال !!!
أنا : هو في اختصار اكبر من هذا !!!!!
هو : نعم .. شوف هذا ...
رمز PHP:
<code style="white-space:nowrap"> <code> for (int i = input; i > 1; input *= --i) ;
</code> </code>
****************
و في نهاية الحديث ..
هو : I was born near a PC...
...
...
...
...
...
((مفاجئة الموضوع))
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
هذا المبرمج عربي مسلم