Created
October 3, 2013 19:44
-
-
Save diegorocha/6815919 to your computer and use it in GitHub Desktop.
Desafio #2 da Globo.com na Python Brasil [9]
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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