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

recursive function

بدأه hop في 27 مايو 2011 · 4 رد · 1,221 مشاهدة · في أرشيف قسم الـــ Assembly
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمه الله وبركاته.

انا عضو جديد في هذه المنتدى الثري بالمعلومات المفيدة

انا لدي سؤال عن كيفية كتاب دالة تستدعي نفسها من دون الحاجة الاستخدام LOOP

انا اردة ان اعمل برنامج يقوم بالتالي المستخدم يدخل رقمين x و y ثم الدالة تختبر الرقمين في ثلاث حالات

1)

IF (X AND Y==0)

THEN RETURN 1

2)

IF (X==0 AND Y !=0) OR (X!=0 AND Y==0)

THEN RETURN 0

3)

ELSE RETURN C(X + 1,Y) = X * C(X,Y) + C(X,Y-1)

وهل هنالك صيغة عامة لتعامل مع recursive function

وشكرا جزيلا

#2

الدالة ستستدعي نفسها حالما تقوم باستدعائها داخل نفسها لمرة واحدة على الأقل.. وهذا ما يحدث في أي عملية recursive.

انظر للشكل التالي مثلاً:

function Factorial(factor) {
	If (factor LTE 1) 
    	return 1;
	else 
    	return factor * Factorial(factor -1);
}

في الكود الذي وضعته والذي تحاول تطبيقه، أعتقد أن هناك خطأ في الجزء الثالث، ذلك أن الطرف الأيسر عادة ما يكون متحول تخزن به القيمة أو لا يكون موجود أساساً باعتبار وجود RETURN.

افرض أن الطرف الأيسر هو نتيجة التابع C والذي أعاد القيمة 0 أو 1 (فرضاً) بسبب تحقق شرط ما، في هذه الحالة سيصبح الطرف الأيسر عبارة عن immediate وهذا خاطئ في أي لغة برمجة أعرفها.

بالمناسبة، تحويل الكود الذي تتحدث عنه (بعد إصلاح الخطأ) إلى لغة الأسمبلي أمر سهل، وليس هناك أي جهد ذهني تقوم به على اعتبار أنك كتبت المعادلة التي ستقوم بتنفيذ الـ recursion سلفاً، فلا يبقى سوى التطبيق وهذا أسهل جزء.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#3

شكرا اخي Xacker على الرد والتوضيح

انا بحث في النت عن هذه المعادلة الرياضية التي تسمى Stirling numbers of the first kind

فوجد في احد المواقع تطبيق لها بلغة الجافا

public static int stirling(int n,int k){

if((n==0)&&(k==0))

return 1;

else if((n>=1)&&(k>0))

return stirling(n-1,k-1)-(n-1)*stirling(n-1,k);

else if(n>0)

return 0;

return 0;

}

ولكني ابقى اجهل كيفية كتابتها بلغة الأسمبلي لاني مازلت اجد صعوبة في كيفية كتابة الدالة واستدعائها وايضا اجد صعوبة في كتابة الشروط اذا كان يربط ينهم AND, OR

اتمنى منك اخي والاعضاء الاخرين مساعدتي توضيح لي اساسيات كتابة الجملة الشرطية والستدعاء الدالة

وارجو منكم مساعدتي في تطبيق هذه المعادلة الرياضية باستخدام لغة الأسمبلي .

اسف على الاطالة ولكن حب التعلم اجبرني على الاطالة عليكم.

#4

السام عليكم ورحمة الله وبركاته

هل يعقل انه لايوجد احد اخر من الاعضاء بامكانه ان يرد على سوالي ولو بمقترح او نصيح او اي شي اخر

ارجو من العضاء الكرام الايبخلو علينا ببعض المساعدة او اي ملاحطات ارجو من الاعضاء التفاعل وابداء الاراء :unsure:

#5

يمكنك اتباع نهج HLA وسيكون بإمكانك كتابة الحلقات الشرطية مثلاً بالشكل المتعارف عليه في اللغات عالية المستوى.

أما بالشكل العام، لنأخذ القسم الأول من المعادلة:

if((n==0)&&(k==0))
				return 1;

نلاحظ أن العملية بين المجموعتين هي AND ونعلم أن انتفاء إحدى المجموعتين كافي لانتفاء الشرط،

بالتالي يكفي أن نتحقق من أن قيمة n!=0 أو أن قيمة k!=0 لانتفاء الشرط وفيما عدا هذا يعيد التابع القيمة 1 (ذلك أن المجموعتين تعيدان TRUE في تلك الحالة)

بالتالي أصبح بالإمكان كتابة هذا القسم بالشكل:

cmp	n,0
jnz	@F
cmp	k,0
jnz	@F
mov	eax,1
jmp	@return
; continue 
;
;
@return:
ret

حيث تلاحظ أني أعيد القيمة 1 في المسجل EAX والذي سيحافظ على قيمته بعد الخروج من التابع.

بناء على ما سبق، كيف تقوم بكتابة الجزء:

if((n>=1)&&(k>0))

بالأسمبلي؟

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

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