Jump to content
Joãop123

Ordem superior

Recommended Posts

Joãop123

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

Share this post


Link to post
Share on other sites
pwseo

@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).

Share this post


Link to post
Share on other sites
Joãop123
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?

Share this post


Link to post
Share on other sites
pwseo

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.

Share this post


Link to post
Share on other sites
Nilo Menezes

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)

 

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.