2013-02-23 4 views
5

की एक पंक्ति से स्टंप किया गया है, मैं बेकारली के माध्यम से अनधिकृत रूप से एक पायथन कोर्स CS61A कर रहा हूं, और मैं पूरी तरह से एक सरल असाइनमेंट द्वारा फंस गया हूं जिसके लिए मुझे प्रदान किए गए टेम्पलेट के अंत में केवल एक अभिव्यक्ति प्रदान करने की आवश्यकता है। यहां समस्या कोड है:पायथन

# HW 4 Q5. (fall 2012) 

def square(x): 
    return x*x 

def compose1(f, g): 
    """Return a function of x that computes f(g(x)).""" 
    return lambda x: f(g(x)) 

from functools import reduce 

def repeated(f, n): 
    """Return the function that computes the nth application of f, for n>=1. 

    f -- a function that takes one argument 
    n -- a positive integer 

    >>> repeated(square, 2)(5) 
    625 
    >>> repeated(square, 4)(5) 
    152587890625 
    """ 
    assert type(n) == int and n > 0, "Bad n" 
    return reduce(compose1, "*** YOUR CODE HERE ***") 

repeated(square, 2)(5) # Sample run 

मैंने इस काम को करने के लिए सबकुछ करने की कोशिश की है। ऐसा लगता है कि इस रिटर्न एसएमटी को यह करना चाहिए:

return reduce(compose1, range(n)) 

लेकिन मैं भी करीब नहीं हूं। कंपोज़ 1 में दो तर्क (एफ, जी) लगते हैं और इन्हें दोनों कार्य करना चाहिए। लेकिन जब रिटर्न स्टेटमेंट 'compose1' कहता है, 'compose1' 'g' के लिए 'f' और 'n' के लिए '0' का उपयोग करता है। लेकिन 'एफ' और 'जी' नामक फ़ंक्शन होना चाहिए - 'वर्ग'

मुझे क्या याद आ रही है।

+0

यहां मेरा संकेत है: आप "f'" के 'nth' अनुप्रयोग की गणना "करने का प्रयास कर रहे हैं - जिसका अर्थ है कि गायब कोड में (किसी भी तरह) दोनों' f' और' n' शामिल होना चाहिए। आपका सुझाया गया रिटर्न स्टेटमेंट 'एफ' के साथ कुछ भी नहीं करता है। इस बारे में सोचें कि आप 'n' के लिए' f' कैसे चलाएंगे। –

उत्तर

1

reduce का एक बढ़त मामला है जब केवल एक आइटम वाली एक सूची प्रदान की जाती है: यह केवल पहला आइटम देता है। तो यदि आप return reduce(compose1, [f]) में [f] दर्ज करते हैं तो यह f के बराबर है।

यदि दो आइटम की आपूर्ति की जाती है तो compose1 वास्तव में उन दो वस्तुओं पर लागू होता है और लौटाया जाता है। तो [f, f] वापसी होगी:

compose(f, f) 
= lambda x: f(f(x)) 

सूची में अगले आइटम पहले तर्क के रूप में पिछले परिणाम के साथ एक साथ दूसरा तर्क के रूप में उपयोग किया जाएगा। तो अगर हम [f, f, f] की आपूर्ति करेगा यह वापसी होगी:

compose(compose(f, f), f) 
= lambda x: f(f(f(x))) 

अब आप एक पैटर्न देखना चाहिए। सूची में प्रत्येक f एक बार लागू होता है। n बार f के साथ एक सूची प्राप्त करने के लिए आपको [f] * n की आवश्यकता होगी।

+0

धन्यवाद टिम। यह अंत में समझ में आता है। मैं वास्तव में स्टंप और निराश था क्योंकि मुझे पता था कि समाधान सरल होना था, लेकिन यह मेरी पहुंच से बाहर था। आपकी व्याख्या सही समझ में आता है। एक बार फिर धन्यवाद। –

0

लिखें दो argements, जो दोनों के कार्यों

range का उपयोग कर आप compse1 (पूर्णांकों की एक जोड़ी है जो ठीक ही ऊपर चल रही है क्योंकि int रों प्रतिदेय नहीं कर रहे हैं गुजर रहे हैं करने की आवश्यकता है लेता है। आप की एक सूची पास करना चाहते हैं जिन कार्यों को आप लिखना चाहते हैं।

reduce अपने दूसरे तर्क के पहले दो तत्वों पर उसके पहले तर्क को कॉल करता है, फिर उस परिणाम और तीसरे तत्व ... जब तक आप अंत तक नहीं पहुंच जाते। मध्यवर्ती परिणाम इस तरह दिखेगा:

compose1(f1, f2) 
compose1(compose(f1, f2), f3) 
compase1(compose1(compose(f1, f2), f3), f4) 
.... 

या अधिक दृढ़तापूर्वक

f1(f2(x)) 
f1(f2(f3(x))) 
f1(f2(f3(f4(x)))) 
.... 
+0

मैं कभी भी 'कम करने' का उपयोग नहीं करता, इसलिए लगा कि मैं इस पर अपना हाथ कोशिश करूंगा - धन्यवाद। मुझे अपने स्पष्टीकरण के चारों ओर अपने सिर को लपेटने में एक मिनट लगा, लेकिन मैंने इसे समझ लिया। –

5

यहाँ एक संकेत है। इस बारे में सोचें कि compose1(square, square) का वापसी मूल्य क्या होगा।