2013-02-23 22 views
5

Tôi không chính thức làm một khóa python CS61A thông qua Berkely, và tôi hoàn toàn bị bối rối bởi một nhiệm vụ đơn giản yêu cầu tôi chỉ cung cấp một biểu thức ở cuối mẫu được cung cấp. Đây là mã sự cố:Stumped bởi một dòng của Python

# 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 

Tôi đã thử mọi thứ để thực hiện công việc này. Dường như với tôi rằng sự trở lại này cần phải làm điều đó:

return reduce(compose1, range(n)) 

Nhưng tôi thậm chí không gần. Compose1 mất hai args (f, g) và cả hai nên có chức năng. Nhưng khi câu lệnh trả về gọi 'compose1', 'compose1' sử dụng '0' cho 'f' và 'n' cho 'g'. Nhưng 'f' và 'g' phải là hàm được gọi là 'square'

Tôi đang thiếu gì.

+0

Đây là gợi ý của tôi: bạn đang cố gắng "tính toán ứng dụng' n '' '' - có nghĩa là mã bị thiếu phải bao gồm (bằng cách nào đó) cả 'f' và' n'. báo cáo trả lại được đề xuất của bạn không làm bất kỳ điều gì với 'f'. suy nghĩ về cách bạn chạy 'f' cho' n' lần. –

Trả lời

1

reduce có trường hợp cạnh khi danh sách chỉ có một mục được cung cấp: Nó chỉ trả về mục đầu tiên. Vì vậy, nếu bạn nhập [f] trong return reduce(compose1, [f]), nó bằng f.

Nếu hai mục được cung cấp compose1 thực sự được áp dụng cho hai mục đó và được trả về. Vì vậy, [f, f] sẽ trở lại:

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

Các mục tiếp theo trong danh sách sẽ được sử dụng như là đối số thứ hai cùng với các kết quả trước đó như là đối số đầu tiên. Vì vậy, nếu chúng tôi sẽ cung cấp [f, f, f] nó sẽ trả về:

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

Bây giờ bạn sẽ thấy một mẫu. Mỗi f trong danh sách được áp dụng một lần. Vì vậy, bạn sẽ cần [f] * n để có danh sách với n lần f.

+0

Cảm ơn bạn Tim. Điều này cuối cùng cũng có ý nghĩa. Tôi đã thực sự bối rối và thất vọng vì tôi biết giải pháp phải đơn giản nhưng nó nằm ngoài tầm với của tôi. Lời giải thích của bạn có ý nghĩa hoàn hảo. Cảm ơn một lần nữa. –

0

Soạn mất hai argements, cả hai đều cần phải được các chức năng

Bằng cách sử dụng range bạn đang đi qua compse1 một cặp số nguyên (mà đúng thổi lên vì int s không callable. Bạn muốn vượt qua một danh sách các các hàm bạn muốn soạn

reduce gọi đối số đầu tiên của nó trên hai phần tử đầu tiên của đối số thứ hai, sau đó là kết quả đó và phần tử thứ ba ... cho đến khi bạn đạt đến kết thúc.

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

hoặc gọn hơn

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

Tôi không bao giờ sử dụng 'reduce' để tìm ra tôi sẽ thử bàn tay của mình tại đây - cảm ơn. Phải mất một phút để quấn đầu tôi xung quanh lời giải thích của bạn, nhưng tôi đã tìm ra nó. –

5

Dưới đây là một gợi ý. Hãy nghĩ về giá trị trả lại của compose1(square, square).

Các vấn đề liên quan