Joãop123 Posted April 8, 2017 at 06:17 PM Report #603539 Posted April 8, 2017 at 06:17 PM Boa tarde , tenho uma duvida num exercício de python. import math def soma_raizes(n): square_root = reduce(lambda x,y:x+math.sqrt(y),range(1,n+1)) return square_root print(soma_raizes(3)) def lista_soma_raizes(n): ... Basicamente o que a primeira função (soma_raizes) faz , é receber um numero(n) e retornar a soma das raízes até esse numero. A minha dúvida está na segunda função(lista_soma_raizes) , que o que faz é basicamente isto: [ √ 1, √ 1 + √ 2, √ 1 + √ 2 + √ 3, . . . , Σ n i=1 √ i] usando a primeira função. A minha dúvida está no facto de ao usar o reduce apenas aparecer o resultado final e não os passos (como um for) em programação iterativa. Alguém me pode esclarecer? Cumprimentos
pwseo Posted April 9, 2017 at 01:09 PM Report #603555 Posted April 9, 2017 at 01:09 PM @Joãop123 Já tentaste consultar a documentação da função reduce()? Se perceberes como funciona, torna-se muito simples compreender o porquê de não aparecer nenhum passo intermédio e apenas o resultado final (o próprio nome da função é indicativo disso mesmo).
Joãop123 Posted April 9, 2017 at 01:26 PM Author Report #603556 Posted April 9, 2017 at 01:26 PM 16 minutos atrás, pwseo disse: @Joãop123 Já tentaste consultar a documentação da função reduce()? Se perceberes como funciona, torna-se muito simples compreender o porquê de não aparecer nenhum passo intermédio e apenas o resultado final (o próprio nome da função é indicativo disso mesmo). Sim já estive a ver a documentação e parece-me que aqui deveria usar um map() , estou correto?
pwseo Posted April 9, 2017 at 04:28 PM Report #603559 Posted April 9, 2017 at 04:28 PM Sim, podes utilizar a função map() em vez do lambda relativamente complexo que tens ali. Tenta imaginar o fluxo de dados: primeiro, envias a lista de números para a função map() que vai aplicar math.sqrt() a cada elemento, e depois envias o resultado disso para a reduce(), que vai «reduzir» (ou colapsar) um par de cada vez, somando cada par.
Nilo Menezes Posted June 2, 2017 at 09:45 AM Report #604900 Posted June 2, 2017 at 09:45 AM Você pode fazer isso com map ou com list comprehensions: [reduce(lambda x,y: x+math.sqrt(y), range(1,x+1),0) for x in range(1,n+1)] Reduce sempre retorna um único elemento. Esta solução é ineficiente, mas acho que você esta praticando o uso de reduce, certo? Ela sempre trabalha com 2 valores de entrada. O primeiro é o resultado anterior e o segundo o elemento atual. A solução tradicional seria: sraizes = [] soma = 0 for x in range(1,n+1): soma += math.sqrt(x) sraizes.append(soma)
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now