Jump to content

Factorial de um número


Yana
 Share

Recommended Posts

Boas, este é um pequeno script que criei, calcula o factorial de um número dado pelo utilizador. É bastante simples mas foi o meu primeiro script em python e quem sabe, até pudera dar jeito a alguém (ou não 😛 ) .

.

def factorial(n):
if not isinstance(n, int):
    print "Fatorial é apenas defenido por números"
    return None
elif n < 0:
    print "Fatorial não é defenido por numeros negativos."
    return None
elif n == 0:
    return 1
else:
    return n * factorial(n - 1)
x = raw_input("Numero para calcular o factorial: " )
print "O factorial de", x, "é " ,factorial(int(x)), "."
raw_input()
Edited by thoga31
GeSHi
Link to comment
Share on other sites

Está engraçado. Mas podes simplificar. O "Return" pode ser de qualquer tipo, pelo que, em vez de Prints e um Return None, ficará mais elegante algo deste género:

return "Erro: ..."

O resultado final seria o seguinte:

def fact(n):
   if not isinstance(n, int):
       return "Erro: input não é número."
   elif not (n >= 0):
       return "Erro: número negativo."
   elif (n == 0):
       return 1
   else:
       return n * fact(n - 1)

Utilização:

>>> fact("ops!")
"Erro: input não é número."
>>> fact(-5)
"Erro: número negativo."
>>> fact(4)
24

Continua com o bom trabalho. É assim que se começa. 😉

Edited by thoga31

Knowledge is free!

Link to comment
Share on other sites

Está engraçado. Mas podes simplificar. O "Return" pode ser de qualquer tipo, pelo que, em vez de Prints e um Return None, ficará mais elegante algo deste género:

return "Erro: ..."

De seguida, quando avalias os números, podes fazer uma avaliação sucessiva com "elif".

O resultado final seria o seguinte:

def fact(n):
if not isinstance(n, int):
	return "Erro: input não é número."
if not (n >= 0):
	return "Erro: número negativo."
elif (n == 0):
	return 1
else:
	return n * fact(n - 1)

Utilização:

>>> fact("ops!")
"Erro: input não é número."
>>> fact(-5)
"Erro: número negativo."
>>> fact(4)
24

Continua com o bom trabalho. É assim que se começa. 😉

Obrigado, o return fica mais 'limpo'. O script ficou mais simples não preciso de por return none.

Link to comment
Share on other sites

Sendo isto uma função recursiva, penso que é desnecessário verificar se o parâmetro passado é ou não um número (e se é ou não positivo).

Este tipo de verificações devem ser feitas antes da parte recursiva (nem que isso implique definir uma função dentro da função factorial).

Imaginem factorial(1000): logo após chamar a função, sabemos que o seu argumento é um número positivo... mas da forma que o código está escrito, também vamos fazer essas verificações para 999, 998, 997, até ao 0, apesar de sabermos que isso é implicitamente verdade.

Podes-me dar um exemplo como ficava o código sff?

Link to comment
Share on other sites

Yana,

Eu simplesmente não faria a verificação dentro da função 🙂

Mas penso que Python suporta nested functions, o que te permitiria fazer algo tipo isto:

def factorial(n):
 def f(n):
   if n == 0:
     return 1
   else:
     return n * f(n - 1)

 if isinstance(n, int) and n >= 0:
   return f(n)
 else:
   return None

Atenção, não testei isto 🙂

Link to comment
Share on other sites

Yana,

Eu simplesmente não faria a verificação dentro da função 🙂

Mas penso que Python suporta nested functions, o que te permitiria fazer algo tipo isto:

def factorial(n):
 def f(n):
if n == 0:
  return 1
else:
  return n * f(n - 1)

 if isinstance(n, int) and n >= 0:
return f(n)
 else:
return None

Atenção, não testei isto 🙂

Ok obrigado, era só para ter uma ideia do código.

Link to comment
Share on other sites

todos os programas que fizeram a cima estão incorrectos ou incompletos

nenhum funciona no IDE

Todos funcionaram comigo, nem um falhou. Que erros te dão?

btw, a que te referes com "IDE"? Será IDLE?

Edited by thoga31

Knowledge is free!

Link to comment
Share on other sites

Portanto, por um programa não funcionar num IDE significa que está incorrecto ou incompleto? Ou será porque o IDE é uma treta?

  • Vote 1

“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Link to comment
Share on other sites

msmsms,

Não sei a que te referes. Provavelmente não testaste correctamente.

Aliás, fiz copy-paste da minha sugestão, acrescentei-lhe uma simples instrução print para ver o output, e funciona perfeitamente, com tu mesmo podes comprovar neste link: http://ideone.com/kXN1i

para mim a forma de como fizeram em cima está incompleta e só complica o que é simples

e uma pessoa que não têm capacidade ou qualidade para simplificar não presta para a programação ou para qualquer outra coisa é apenas a minha openião

eu fazia o programa da seguinte forma e bastava!

# factorial de n
def factorial(n):

   f=1
   c=0

   while c < n:
	    c = c + 1
	    f = f * c
   return f
if __name__=='__main__':
   n = input ('facturial de:')
   print factorial(n)
Edited by msmsms
Link to comment
Share on other sites

para mim a forma de como fizeram em cima está incompleta e só complica o que é simples

e uma pessoa que não têm capacidade ou qualidade para simplificar não presta para a programação ou para qualquer outra coisa é apenas a minha openião

eu fazia o programa da seguinte forma e bastava!

# factorial de n
def factorial(n):

f=1
c=0

while c < n:
	 c = c + 1
	 f = f * c
return f
if __name__=='__main__':
n = input ('facturial de:')
print factorial(n)

Dude, dominas python? Parabéns 🙂

Agora eu ainda estou a apender.

Abraço Sentido

Link to comment
Share on other sites

Vamos lá tornar as coisas interessantes... que tal uma solução de 1 linha, apenas? Ignoro a verificação do input e ignoro o caso do factorial de 0 (zero). 😄

#A seguinte linha vale SÓ para o Python 3!
from functools import reduce

#Colocar os parêntesis no Print para o Python 3!
print reduce(lambda x, y: x * y, [i for i in range(n, 0, -1)])
Edited by thoga31

Knowledge is free!

Link to comment
Share on other sites

msmsms,

Eu até tinha escrito uma resposta grande e decente, mas um dia depois, li este teu juízo de valor absurdo:

para mim a forma de como fizeram em cima está incompleta e só complica o que é simples

e uma pessoa que não têm capacidade ou qualidade para simplificar não presta para a programação ou para qualquer outra coisa é apenas a minha openião

Quando li isto melhor, apaguei a resposta anterior, e vim escrever esta, que acho mais apropriada.

Espero que a moderação esteja atenta a futuras intervenções tuas onde não lês o que está a ser feito, acusas os outros de incompetência (e na realidade fazes código menos competente) e ainda pensas poder vir falar da aptidão dos outros para programar.

E já agora vou poupar-te o trabalho e dizer-te aquilo que não viste (apesar das tuas skills): as soluções apresentadas fazem tudo o que a tua faz e além disso lidam com input inválido da parte do utilizador (que estava presente no código original do Yana).

Edited by pwseo
Link to comment
Share on other sites

Pah, tecnicamente o msmsms ainda está a aprender Python, pelo que acho que a opinião dele não deve influenciar a assim tanto a realidade 😉

Ter que fazer código especial só para "correr" num IDE já é bastante mau, na minha opinião. De facto, tendo em conta que eu prefiro ter total controlo sobre o processo de desenvolvimento, nem sequer costumo ter um IDE entre mim e o meu código.

“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Link to comment
Share on other sites

Pah, tecnicamente o msmsms ainda está a aprender Python, pelo que acho que a opinião dele não deve influenciar a assim tanto a realidade 😉

Sim, a realidade não se alterou (de facto, até se riu de algumas coisas), mas a atitude demonstrada (que claramente não foi uma mera partilha de opinião*) é completamente dispensável aqui, como referido pelo criador da thread.

*se por acaso foi apenas uma partilha de opinião, então foi escrita no tom errado (e ninguém é obrigado a "ver o bem" numa resposta mal pensada).

Link to comment
Share on other sites

O tópico foi trancado por violação das regras do fórum, em especial o ponto 2.2 transcrito em anexo, e pelo facto de esse mesmo post ter resultado numa série de offtopic.

2. Tópicos e mensagens:

2. Não será tolerada qualquer tipo de falta de respeito para com outro utilizador, o respeito deve ser mutuo e o nosso objectivo é manter a comunidade com um espirito agradável. Mensagens desta natureza poderão ser apagadas ou editadas sem qualquer aviso.

in Regras do Fórum

  • Vote 1

Knowledge is free!

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
 Share

×
×
  • 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.