بايثون غير حتمية إبسيلون أوتوماتون:الكائن غير قابل للتكرار

StackOverflow https://stackoverflow.com//questions/23022164

سؤال

لا بد لي من صنع إنسان آلي محدود غير حتمي باستخدام انتقالات إبسيلون.أنا أحب لغة البرمجة c وc# وجافا سكريبت، لكن جامعتي تعتقد أن لغة بايثون هي الطريقة الوحيدة للذهاب لسبب ما، لذلك تعلمت اليوم لغة بايثون، ولكن من الواضح أنها ليست كافية.

على أي حال.المشكلة في "automaton" وظيفة.أسميها بقائمة الحالة الأولية بعنصر واحد (stanje1) ومجموعة من الأحرف التي يجب على الإنسان قراءتها (inputArrays[0]) مع القاموس الذي يحدد وظيفة الانتقال (مفتاح القاموس هو سلسلة currentState,inputCharacter والقيمة هي مجموعة من الحالات التالية).

يعمل التكرار الأول بشكل جيد، ولكن عندما أرغب في التحقق بشكل متكرر من جميع الحالات التي حصلت عليها عبر انتقال epsilon مقابل الحرف التالي، أحصل على خطأ:

TypeError: 'NoneType' object is not iterable

يتم استدعاء التكرار التلقائي مع تعريف جميع الوسائط بشكل مشابه كما هو الحال في الاستدعاء العلوي، ومع ذلك يظهر الخطأ بطريقة ما.

هنا رابط إلى الكود الخاص بي, ، وكذلك ملف الاختبار ذلك يحدد الإنسان الآلي (تحتاج إلى تشغيله بهذه الطريقة myScript.py < automaton.txt).إليك أيضًا تقرير الخطأ الكامل:

C:\Users\Jinx\Desktop\UTRLabos1>sim.py < test.txt
['stanje1']
['st6']
Traceback (most recent call last):
File "C:\Users\Jinx\Desktop\UTRLabos1\sim.py", line 50, in <module>
    print(automaton(['stanje1'], inputArrays[0], transitionFunction))
File "C:\Users\Jinx\Desktop\UTRLabos1\sim.py", line 45, in automaton
    if estates : other = automaton(estates, ir[1:], fn)
File "C:\Users\Jinx\Desktop\UTRLabos1\sim.py", line 37, in automaton
    states += eNKA(s, ir[0], fn)
TypeError: 'NoneType' object is not iterable
هل كانت مفيدة؟

المحلول

تلميحك هو أن العطل يحدث على هذا السطر:

states += eNKA(s, ir[0], fn)

وليس أعمق داخل eNKA وظيفة.قد تشك في أن هناك شيئًا ما على هذا الخط None, ، بدلاً من التكرار. ir لا يمكن أن يكون None لأنك تحققت من هذا الاحتمال سابقًا، لذلك يجب أن تكون القيمة المرجعة لـ eNKA يكون None (وأنتم تفعلون بفعالية states += None).

في الواقع، هذا هو الحال. eNKA لا return قيمة في كل حالة ممكنة، مما قد يؤدي إلى القيمة الافتراضية لـ None يجب إعادته.

وبالتالي، فإن الإصلاح سيكون لمعرفة لماذا كل if حالة في eNKA يفشل، وأصلح ذلك بشكل مناسب (أو قم بإرجاع شيء أكثر منطقية في حالة فشل كل شرط).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top