Skip to content

Instantly share code, notes, and snippets.

@diegorocha
Created October 3, 2013 19:44
Show Gist options
  • Save diegorocha/6815919 to your computer and use it in GitHub Desktop.
Save diegorocha/6815919 to your computer and use it in GitHub Desktop.
Desafio #2 da Globo.com na Python Brasil [9]
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from sys import argv
import unittest
class FatorialTest(unittest.TestCase):
def test_rNegativo(self):
self.assertRaises(ValueError, rFatorial(-1))
def test_0r(self):
self.assertEqual(1, rFatorial(0))
def test_1r(self):
self.assertEqual(1, rFatorial(1))
def test_2r(self):
self.assertEqual(2, rFatorial(2))
def test_5r(self):
self.assertEqual(120, rFatorial(5))
def test_10r(self):
self.assertEqual(3628800, rFatorial(10))
def test_20r(self):
self.assertEqual(2432902008176640000, rFatorial(20))
def test_30r(self):
self.assertEqual(265252859812191058636308480000000, rFatorial(30))
def test_iNegativo(self):
self.assertRaises(ValueError, iFatorial(-1))
def test_0i(self):
self.assertEqual(1, iFatorial(0))
def test_1i(self):
self.assertEqual(1, iFatorial(1))
def test_2i(self):
self.assertEqual(2, iFatorial(2))
def test_5i(self):
self.assertEqual(120, iFatorial(5))
def test_10i(self):
self.assertEqual(3628800, iFatorial(10))
def test_20i(self):
self.assertEqual(2432902008176640000, iFatorial(20))
def test_30i(self):
self.assertEqual(265252859812191058636308480000000, iFatorial(30))
pass
"""
Implementacao recursiva.
É mais simples e ~elegante~ mas perde perfomance por causa do empilhamento das chamadas recursivas (quanto maior o número maior o número de chamadas recursivas)
"""
def rFatorial(n):
if n < 0: #Na duvida de como tratar o zero, assumi que ele é válido, pois ele tem fatorial = 1
raise ValueError("Fatorial apenas de números positivos")
if n < 2: #0! = 1! = 1
return 1
else:
return n * rFatorial(n-1)
"""
Implementacao iterativa.
É mais rápida que a recursiva, mas utiliza duas variáveis e é tida como menos ~elegante~ que a recursiva
"""
def iFatorial(n):
if n < 0: #Na duvida de como tratar o zero, assumi que ele é válido, pois ele tem fatorial = 1
raise ValueError("Fatorial apenas de números positivos")
f = 1
i = 2
while i <= n:
f *= i
i += 1
return f
if __name__ == '__main__':
if len(argv) == 1:
unittest.main(verbosity=2)
#Não estou testando os argumentos, é só um protótipo :-P
if argv[1] == 'r':
print rFatorial(int(argv[2]))
elif argv[1] == 'i':
print iFatorial(int(argv[2]))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment