2013-02-23 7 views
5

저는 비공식적으로 파이썬 강좌 CS61A에서 Berkely를하고 있습니다. 제공된 템플릿의 맨 끝에 단 하나의 표현식 만 제공해야하는 간단한 할당으로 인해 나는 완전히 혼란 스럽습니다. 다음은 문제 코드입니다.파이썬의 한 줄만 쓰다

# 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)) 

나는 가까이 있지 않습니다. Compose1은 두 개의 args (f, g)를 취하며 둘 다 함수 여야합니다. 그러나 return 문에서 'compose1'을 호출하면 'compose1'은 'f'에 '0'을 사용하고 'g'에 'n'을 사용합니다. 그러나 'f'와 'g'는 'square'라는 함수 여야합니다.

내가 무엇이 누락 되었습니까?

+0

여기에 제 암시가 있습니다. "f"의 'n 번째'응용 프로그램을 계산하려고합니다. 즉, 누락 된 코드에는 (f)와 (n)을 모두 포함해야합니다. 제안 된 return 문은'f'로 아무 것도하지 않습니다. ''n '번 실행하는 방법에 대해 생각해보십시오. –

답변

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은 한 번 적용됩니다. 따라서 nf으로 목록을 보려면 [f] * n이 필요합니다.

+0

Tim 감사합니다. 이것은 마침내 의미가 있습니다. 솔루션이 단순해야한다는 것을 알았 기 때문에 나는 정말로 혼란스럽고 좌절감을 느꼈습니다. 당신의 설명이 완벽합니다. 다시 한번 감사드립니다. –

0

작성하면 compse1에게 int의이 호출하지 않기 때문에 당연히 불면 정수의 쌍 (전달하는 range를 사용하여 기능

을 할 필요가 둘 다 두 argements을합니다. 당신의 목록을 전달하려면

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

나는'reduce'을 결코 사용하지 않는다. 그래서 나는 내 손을 시험해 볼 것이라고 생각했다. - 고마워. 당신의 설명에 대해 머리를 감싸는 데 분이 걸렸지 만, 나는 그것을 알아 냈습니다. –

5

여기에 힌트입니다. compose1(square, square)의 반환 값이 무엇인지 생각해보십시오.