Scholieren.com forum

Scholieren.com forum (https://forum.scholieren.com/index.php)
-   Huiswerkvragen: Exacte vakken (https://forum.scholieren.com/forumdisplay.php?f=17)
-   -   [IN] Programmeren (https://forum.scholieren.com/showthread.php?t=1661441)

Tripp 12-01-2008 11:14

[IN] Programmeren
 
Ik heb een klein probleempje met een vraag over het programmeren in python.

De Vraag:

Perfect numbers
A perfect nuber is one whose factors (except itself) sum to itself. For example, the facors of 6 are 1,2,3 and 6. Since 1+2+3 is 6, it (6) is considered a perfect number. Write a function called isperfect() which takes a single integer input and outputs 1 if the number is perfect and 0 otherwhise.

Op dit moment heb ik dit staan, alleen het werkt niet:


Code:

n = int(raw_input("Vul een getal in:"))

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


Misschien dat iemand kan helpen?

Groetjes,
Tripp

ILUsion 12-01-2008 11:56

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


Alle tijden zijn GMT +1. Het is nu 04:54.

Powered by vBulletin® Version 3.8.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.