2015-01-22 7 views
9

मुझे एक दिमागी चुनौती पहेली है जिसे मैं अजगर का उपयोग करके हल करना चाहता हूं। वे 4 नंबर (25, 28, 38, 35) देते हैं और वे चाहते हैं कि हम संख्याएं ... + ...-... = ... एक संभावित समाधान 25 + 38-35 = 28 है। मैं करने की कोशिश की, नंबरों से एक सूची बनाने, उन्हें कुछ छोरों और एक साथ पुनरावृति यदि: lst = [25, 28, 38, 35]पायथन: एक सूची के माध्यम से पुनरावृत्त

for z in lst: 
    for x in lst: 
     for c in lst: 
      for v in lst: 
       if z+x-c==v: 
        print z,x,c,v 

लेकिन जब एक छोरों वे दोहराने के लिए रन संख्याएं, (25 + 25-25 = 25) और यह काम नहीं करती है। मैं इसे कैसे सुलझाऊं?

+11

itertools.permutations में देखो – user2097159

+0

काफी सबसे अच्छा तरीका है पायथन में सभी क्रमपरिवर्तन को देखने के लिए एक तरफ से, (जोड़कर पर विचार समीकरण के दोनों तरफ 'सी') कि आप चार से किसी भी दो मूल्यों की तलाश में हैं, जो एक साथ योग के आधे तक जोड़ते हैं। तो आपको वास्तव में सभी 24 क्रमिकताओं की आवश्यकता नहीं है, आप केवल 6 विभाजनों पर विचार कर सकते हैं: 'itertools.permutations (lst, 2) 'से पहले 6 मान। और यदि मान पूर्णांक हैं और योग अजीब है तो इसके बारे में भूल जाओ :-) –

उत्तर

9

के रूप में लुइस 'टिप्पणी का संकेत दिया, एक अच्छा दृष्टिकोण,

import itertools 

for z, x, c, v in itertools.permutations(lst): 
    if z+x-c==v: 
     print z,x,c,v 

"फ्लैट नेस्ट से बेहतर है" है import this एक इंटरैक्टिव अजगर प्रॉम्प्ट पर याद दिलाएगा रूप :-)

1
Def recadd(lis): 
     If lis[0] + lis[1] - lis[2]] = lis[3]: 
       return lis 
     Else: 
       recadd(lis[3] + lis[0:2]) 
       recadd(lis[0] + lis[3] + lis[1:2]) 
       recadd(lis[0:1] + lis[3]. + lis[2]) 

त्वरित और मेरे मोबाइल पर गंदे हैक, के नंबरों के लिए खूबसूरती से विस्तार किया जा सकता है, अवांछित लेकिन यह काम करना चाहिए।

संपादित करें: एहसास हुआ कि अगर कोई solution.infinite प्रत्यावर्तन इस काम नहीं करेगा ...

संबंधित मुद्दे