পাইথন: সর্বাধিক পুনরাবৃত্তির গভীরতা অতিক্রম করেছে


86

আমার নীচের পুনরাবৃত্তির কোড রয়েছে, প্রতিটি নোডে আমি নোড প্যারেন্ট নোডের অন্তর্ভুক্ত পেতে এসকিএল কোয়েরি কল করি।

ত্রুটি এখানে:

Exception RuntimeError: 'maximum recursion depth exceeded' in <bound method DictCursor.__del__ of <MySQLdb.cursors.DictCursor object at 0x879768c>> ignored

RuntimeError: maximum recursion depth exceeded while calling a Python object
Exception AttributeError: "'DictCursor' object has no attribute 'connection'" in <bound method DictCursor.__del__ of <MySQLdb.cursors.DictCursor object at 0x879776c>> ignored

এসকিএল ফলাফল পেতে আমি যে পদ্ধতিটি কল করি:

def returnCategoryQuery(query, variables={}):
    cursor = db.cursor(cursors.DictCursor);
    catResults = [];
    try:
        cursor.execute(query, variables);
        for categoryRow in cursor.fetchall():
            catResults.append(categoryRow['cl_to']);
        return catResults;
    except Exception, e:
        traceback.print_exc();

উপরোক্ত পদ্ধতিটি নিয়ে আমার আসলে কোনও সমস্যা নেই তবে প্রশ্নের যথাযথ ওভারভিউ দেওয়ার জন্য আমি যাইহোক এটি রেখেছি।

পুনরাবৃত্তি কোড:

def leaves(first, path=[]):
    if first:
        for elem in first:
            if elem.lower() != 'someString'.lower():
                if elem not in path:
                    queryVariable = {'title': elem}
                    for sublist in leaves(returnCategoryQuery(categoryQuery, variables=queryVariable)):
                        path.append(sublist)
                        yield sublist
                    yield elem

পুনরাবৃত্তি ফাংশন কল করা

for key, value in idTitleDictionary.iteritems():
    for startCategory in value[0]:
        print startCategory + " ==== Start Category";
        categoryResults = [];
        try:
            categoryRow = "";
            baseCategoryTree[startCategory] = [];
            #print categoryQuery % {'title': startCategory};
            cursor.execute(categoryQuery, {'title': startCategory});
            done = False;
            while not done:
                categoryRow = cursor.fetchone();
                if not categoryRow:
                    done = True;
                    continue;
                rowValue = categoryRow['cl_to'];
                categoryResults.append(rowValue);
        except Exception, e:
            traceback.print_exc();
        try:
            print "Printing depth " + str(depth);
            baseCategoryTree[startCategory].append(leaves(categoryResults))
        except Exception, e:
            traceback.print_exc();

অভিধান মুদ্রণের জন্য কোড,

print "---Printing-------"
for key, value in baseCategoryTree.iteritems():
    print key,
    for elem in value[0]:
        print elem + ',';
    raw_input("Press Enter to continue...")
    print

পুনরাবৃত্তিটি যদি খুব গভীর হয় তবে আমার পুনরাবৃত্তি ফাংশনটি কল করার সময় আমার ত্রুটি হওয়া উচিত, তবে আমি অভিধানটি মুদ্রণের সময় এই ত্রুটিটি পাই।


8
এটি পুনরাবৃত্তির পরিবর্তে পুনরাবৃত্তি করুন।
শেঠ কার্নেগি

4
if first:চেক সাথে অপ্রয়োজনীয় for elem in first:। যদি কোয়েরিটি খালি ফলাফলের তালিকাটি দেয়, তবে এটির পুনরাবৃত্তি কেবল আপনার ইচ্ছা অনুসারে সঠিকভাবে কিছুই করবে না। এছাড়াও, আপনি তালিকাটি বোঝার সাথে আরও সহজভাবে তালিকাটি তৈরি করতে পারেন (এবং সেমিকোলনগুলি অপ্রয়োজনীয় এবং সাধারণত কুৎসিত হিসাবে বিবেচিত হয় :))
কার্ল নচেটেল

@ কার্লকনেটেল সেমিকোলন সম্পর্কে দুঃখিত, আপনি কি বলতে পারবেন যে আমি ঠিক পাইথন প্রোগ্রামিংয়ে যাচ্ছি .... :)
অ্যাড-সেমি-কলোন

ক্ষমা চাওয়ার দরকার নেই, লেখার পরেও আমি আপনাকে অর্থ প্রদান করছি না :) আমি আশা করি আপনি পাইথনকে মুক্তি পাচ্ছেন;)
কার্ল ন্যাচেল

উত্তর:


167

আপনি অনুমোদিত স্ট্যাকের গভীরতা বৃদ্ধি করতে পারেন - এর সাথে আরও গভীর পুনরাবৃত্তির কলগুলি সম্ভব হবে, এর মতো:

import sys
sys.setrecursionlimit(10000) # 10000 is an example, try with different values

... তবে আমি আপনাকে প্রথমে আপনার কোডটি অপ্টিমাইজ করার চেষ্টা করার পরামর্শ দেব, উদাহরণস্বরূপ, পুনরাবৃত্তির পরিবর্তে পুনরাবৃত্তি ব্যবহার করে।


4
আমি 10000 এর পরিবর্তে আমি লাইনটি যুক্ত করেছি 30000 আমি যুক্ত করেছি তবে আমি সেগমেন্টেশন ফল্ট (কোর ডাম্পড) শেষ করেছি :(
-

16
এটির 1000 নির্ধারণের একটি কারণ রয়েছে ... আমি বিশ্বাস করি গুইডো ভ্যান রসুম এ সম্পর্কে কিছু বলেছিল
লাম্বদা পরী

4
সুতরাং গিডোর যুক্তি হ'ল যথাযথ লেজ কলিং (1) আরও খারাপ স্ট্যাকের ট্রেস সরবরাহ করে --- আপনি যখন এটি পুনরাবৃত্তভাবে লিখবেন তখন কোনও ফ্রেমের কোনও বিপরীতে নয়? কী করে খারাপ? (২) যদি আমরা তাদেরকে কিছু সুন্দর উপহার দিই তবে তারা তার উপর নির্ভর করতে শুরু করে। (৩) আমি এতে বিশ্বাস করি না, এটি স্কিমের মতো গন্ধযুক্ত। (4) পাইথনটি খারাপভাবে ডিজাইন করা হয়েছে, যাতে কোনও সংকলক দক্ষতার সাথে আবিষ্কার করতে পারে না যে কোনও কিছু টেল কল কিনা। আমি অনুমান করি যে আমরা যার সাথে একমত হতে পারি?
জন

4
@ হাজেফ তৃতীয়, লেজ-কলিং অবশ্যই কেবল তালিকার জন্য নয়; যে কোনও গাছের কাঠামো জেতা একটি লুপে পুনরাবৃত্ত কলগুলি ছাড়াই একটি গাছকে ট্রাই করার চেষ্টা করুন; আপনি হাতে হাতে স্ট্যাক মডেলিং আপ। অবশেষে, আপনার যুক্তি যে পাইথন কখনই এইভাবে ডিজাইন করা হয়নি তা অবশ্যই সত্য তবে এটি toশ্বরের নকশা হিসাবে আমাকে বোঝানোর পক্ষে খুব কম নয়।
জন

4
ভ্যান রসমের পুনরাবৃত্তি সম্পর্কে তার বোনে একটি মৌমাছি রয়েছে বলে কেবল পুনরাবৃত্তির পরিবর্তে পুনরাবৃত্তি "অনুকূল" নয়: আপনি যা অনুকূল করছেন তার উপর নির্ভর করে!
জিন Callahan
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.