السلام عليكم
اقتباسباستخدامه يحصل لدينا غموض والتباس بالنسبة للكود ، مثلاً الكود الذي كتبته أنت يعتبر unreadable ولو كنت تعمل في شركة وأراد أحد تطوير الكود فلن يستطيع أو سيصعب عليه بسبب الغموض والالتباس .
لا أوافقك الرأي :sleep: مع احتراي التام لك :wub:
الغموض لا يتعلق باستخدام الإستدعاء الذاتي بقدرما يتعلق بالطريقة المُعتمدة في حل الكود .. فيمكننا أن نجد غموضا في كود بدائي (يحتوي على 10 أسطر مثلا) و لكن المنهجية المُتبعة لحله (بالتأكيد) ستكون سيئة ...!
سأعود و أشرح الطريقة التي اتبعتها في حل التمرين.
الفكرة ببساطة هي محاولة اختزال الدالتين fact و pow في دالة واحدة.
float sin(float x,int r)
{
int i=0,n=0;
float result=0;
if(r%2==0) r++;
while(n!=r)
{
if(x==0) result=1;
else
{
if(++i%2!=0)
result+=(x*sin(x,n-1)/n*sin(1,n-1));
else
result+=(-x*sin(x,n-1)/n*sin(1,n-1));
}
n+=2*n+1;
}
return result;
}الدالة sin تستقبل متغيرين أحدهما float و الآخر int
بالنسبة لـ x فهي الزاوية المُراد حساب جيبها و المتغير r عبارة عن الأس الذي نتوقف عنده.
الهدف من المتغير i هو تغيير إشارة الجزء المُضاف للمجموع في كل مرة فإذا كان i فرديا فإننا نضع إشارة موجبة أمام المجموع أما إذا كان i زوجيا فإننا نضع إشارة سالبة أمام المجموع.
أما المتغير n فهو يمثل الأس في كل مرة و السبب في كتابة هذا السطر:
n+=2*n+1;
لأن الأس فردي دائما , لاحظ أننا نتوقف عندما تكون n تساوي r أي أن المتغير n يمثل الأس المؤقت.
لاحظ أننا نزيد المتغير r بواحد عندما يكوت زوجيا و ذلك لكي لا تكون الدوارة غير منتهية.
انتظر تعليقك على الدالة .. أريد أن أضعها في كود و يعمل :)
اقتباسless efficient as compared to the non-recursive counterparts as the overhead involved in entering,re-entering and exiting a block is avoided in case of the non recursive forms. its also possible to identify a number of local variables which need not be saved and restored with the help of stacks and this unwanted stacking activity is avoided in the non-recursive versions
يا ريت تترجم لي هذه الفقرة .. جربت مع جوجل بس ما نجحت :blush:
اقتباسدعك من تلك الطريقة - سأعطيك واحدة جديدة تعطي نتائج ممتازة
أريد الطريقتان معا :lol:
الطريقة الأولى أريدها لكي لا أقع في الأخطاء مستقبلا و الطريقة الثانية لكي أضيف فكرة جديدة إلى أفكاري :wink:
بالنسبة للطريقة الثانية فهي جميلة جدا .. مع أني لم أفهمها بشكل كامل :blush:
جاري التفكير ... :blink: