Kertoma-ongelma

Minulla on pythonilla tehty koodi, joka ei toimi haluamallani tavalla, joten käytän nyt ongelman havainnollistamiseksi pseudoa..

Minulla on siis seuraavanlainen pätkä

module kertoma(n) returns n kertoma
if n = 0 then
return 1
else
return n * kertoma(n-1)
endif
endmodule

Mitä tapahtuu, jos kertoman arvoksi tulisi negatiivinen luku, esim. -1? koodissahan ei ole erillistä tarkistusta luvuille, jotka ovat
5843
Äänestä

Muut lukivat myös

Vastaukset 5

Vanhimmat

Jos kutsut (kertoma(-1) niin seurauksena on pinon ylivuoto riittävän monen kierroksen jälkeen.
Katkaisuehto n=0 ei koskaan täyty.

Äänestä

Parillisten negatiivisten lukujen kertoma olisi kaiketi sama kuin positiivisten, mutta parittomien negatiivisten lukujen kertoma olisi vastaluku positiivisesta kertomasta. Jos siis funktio toimisi jotakin palauttaen negatiivisillakin luvuilla. Riippuu ...

Äänestä

Vaikka rekursia onkin hauskaa, ei kannata sitä välttämättä joka paikkaan tunkea ;)

Ylivuotoa ei sentään pääse tapahtumaan, vaikka loppuehto ei täyttyisikään. Pythonissa on rekursioiden riistätytyminen käsistä estetty (sys.setrecursionlimit ja sys.getrecursionlimit).

Tässäpä vaikka simppeli tapa tehdä vastaava ja esimerkiksi vaikka tuo negatiivisten lukujen tarkistus - poikkeukset, ne poikkeukset:

def kertoma(n):
....f n < 0:
.......raise ValueError('kertoma() ei ole määritelty negatiivisilla arvoilla')
... foo = 1
... for i in xrange(1, n 1):
........foo *= i
....return foo

Ja ihan tiedoksi, jos kertomaa haet vain käyttöä varten etkä muuten vain kikkaillaksesi. Valmis funktiokin löytyy:
>>> import math
>>> math.factorial(10)
3628800

Äänestä
  • Muista vielä tarkistaa että luku on kokonaisluku. Viimeksi kun tarkistin, kertomia ei laskettu desimaaliluvuille :)

    Äänestä

  • on silti ylivuoto. Ohjelma olisi kyrvähtänyt jos rekursiota ei erityisesti pysäytettäisi. Toki varsinaista kalssista ylivuotoilmoitusta ei taitaisi tulla, mutta lopputulos on käytännössä sama.
    Kekkekeelle pisteitä, koska opin vaihteeksi uutta.

    Äänestä

Kommentoi aloitusta


00000000000000000000 kirjoitti:

Minulla on pythonilla tehty koodi, joka ei toimi haluamallani tavalla, joten käytän nyt ongelman havainnollistamiseksi pseudoa..

Minulla on siis seuraavanlainen pätkä

module kertoma(n) returns n kertoma
if n = 0 then
return 1
else
return n * kertoma(n-1)
endif
endmodule

Mitä tapahtuu, jos kertoman arvoksi tulisi negatiivinen luku, esim. -1? koodissahan ei ole erillistä tarkistusta luvuille, jotka ovat

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu