2013-02-23 7 views
5

Sto facendo ufficiosamente un corso Python CS61A tramite Berkely, e sono assolutamente sconcertato da un semplice compito che richiede di fornire solo un'espressione alla fine del modello fornito. Ecco il codice problema:Arrestato da una riga di 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 

Ho provato di tutto per farlo funzionare. Mi sembra che questo return stmt dovrebbe farlo:

return reduce(compose1, range(n)) 

Ma non sono nemmeno vicino. Compose1 richiede due argomenti (f, g) e questi dovrebbero essere entrambi funzioni. Ma quando l'istruzione return chiama 'compose1', 'compose1' usa '0' per 'f' e 'n' per 'g'. Ma "f" e "g" dovrebbero essere la funzione chiamata "square"

Cosa mi manca.

+0

Ecco il mio suggerimento: stai cercando di "calcolare l'ennesima applicazione di' f' "- il che significa che il codice mancante deve includere (in qualche modo) sia' f' che 'n'. la tua dichiarazione di reso suggerita non fa nulla con 'f'. pensa a come avresti eseguito 'f' per' n' volte. –

risposta

1

reduce ha un caso limite quando viene fornito un elenco con un solo articolo: Restituisce semplicemente il primo elemento. Quindi se inserisci [f] in return reduce(compose1, [f]) è uguale a f.

Se vengono forniti due articoli, compose1 viene effettivamente applicato a questi due articoli e restituito. Così [f, f] sarebbero tornati:

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

L'elemento successivo nella lista verrà utilizzato come secondo argomento insieme al risultato precedente come primo argomento. Quindi, se vogliamo fornire [f, f, f] che sarebbe tornato:

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

Ora si dovrebbe vedere un modello. Ogni f nell'elenco viene applicato una volta. Quindi avresti bisogno di [f] * n per ottenere una lista con n volte f.

+0

Grazie Tim. Questo ha finalmente un senso. Ero davvero stordito e frustrato perché sapevo che la soluzione doveva essere semplice ma era fuori dalla mia portata. La tua spiegazione ha perfettamente senso. Grazie ancora. –

0

Componi prende due argements, entrambi i quali hanno bisogno di essere funzioni

Usando range che state attraversando compse1 una coppia di numeri interi (che soffia giustamente a causa int s non sono richiamabili. Si vuole passare un elenco di le funzioni che vuoi comporre

reduce chiama il primo argomento sui primi due elementi del secondo argomento, quindi su quel risultato e sul terzo elemento ... fino a raggiungere la fine. I risultati intermedi saranno simili a:

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

o in modo più compatto

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

Non uso mai 'reduce', quindi ho pensato di provare a farlo - grazie. Mi ci è voluto un minuto per comprendere la tua spiegazione, ma l'ho capito. –

5

Ecco un suggerimento. Pensa a quale sarebbe il valore di ritorno di compose1(square, square).

Problemi correlati