Let erop: Python is white-spacegevoelig (en er zijn nog meerdere regeltjes daarvoor; maar die zou je normaal wel moeten kennen). Zet hier je code (eigenlijk bij om het even welke programmeertaal tussen [code][/code]-tags.
Code:
def factorial(n):
if n <= 0:
return 1
else:
return n * factorial(n-1)
def fac(n):
sum = 1
for i in range(1,n+1):
sum *= i
return sum
Beide functies zouden volgens mij moeten uitkomen (voor de natuurlijke getallen tenminste). Ik heb ze niet getest, trouwens. Het verschil tussen beiden: in de eerste roep je heel veel functies aan, zeker in een scripttaal als Python is dat niet aan te raden (het geheugengebruik gaat in dat geval heel snel oplopen. Bij de tweede ga je dat niet doen (gewoon een lus, dus het geheugengebruik is ongeveer constant en ook de uitvoertijd gaat bijgevolg korter zijn: je computer zal niet bezig zijn met het aanmaken van zoveel functies; maar gewoon de teller met eentje verhogen elke keer).
Maar volgens mij ben je ook naast de vraag aan het werken: een factorial/faculteit gaat je niet geven of je een volmaakt getal krijgt.
Wat je volgens mij moet doen: je input is N; als je nu daarvan alle mogelijke delers afgaat en nagaat welke getallen deler zijn, en die getallen allemaal optelt en controleert of dat hetzelfde is als N, dan kan je daarop gaan vergelijken. Waarschijnlijk zal er ook een iets betere methode bestaan (of eentje die beter gebruik maakt van de mogelijkheden van Python).
Code:
def is_perfect(n):
sum = 1
for i in range(2,n//2+1):
if n%i == 0:
sum += i
return (sum == n)
En mijn bedenkingen bij je boek: 1 of 0 laten teruggeven bij dergelijke functie is nogal unpythonic (mooier zou True of False zijn; dat is ook wat ik gedaan heb).