Kertoma-ongelma

00000000000000000000

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

5

729

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • Buudda

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

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

    • kekkekee

      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

      • kekkekee

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


      • buudda

        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.


    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Metsäkoneen kuljettaja huuteli tutkijalle

      "voisit kyllä ottaa rintaliivit pois ennen kuin tulet minulle juttelemaan, hän sanoo." https://yle.fi/a/74-20106446 On
      Suomussalmi
      704
      10320
    2. Suomi on täysin sekaisin

      Jo ties monettako päivää hirveä itku ja poru jostain helvetin nilviäisistä. https://www.is.fi/taloussanomat/art-2000010
      Maailman menoa
      422
      4594
    3. Kaikki ei vieläkään usko luontokatoon.

      Suomussalmen Hukkajoella foliohattu metsäkoneen kuljettaja tuhosi tuhansia harvinaisia jokihelmisimpukoita eli raakkuja
      Kajaani
      92
      3114
    4. Sano vain suoraan, että nyt riittää

      ettei kiinnosta. Sano, että lopeta! En ihmettelisi, jos olet saanut tarpeeksesi ja toivot minun ymmärtävän lopettaa. Eh
      Ikävä
      43
      2875
    5. Ohhoh! Ex-pääministeri Sanna Marinin Joni-rakas paljasti ilouutisen: "Tässä kuussa..."

      Sanna Marin on ollut naimisissa Markus Räikkösen kanssa. Nyt hänen seurassaan on usein julkkishiusmuotoilija Joni Willb
      Kotimaiset julkkisjuorut
      55
      2714
    6. Mari Rantanen asettaa sairaan lapsen edun oman uransa edelle - (tekikö Marin samaa)

      Noin toimii kunnon vastuuntuntoinen äiti, mutta siitäkin nämä mt-ongelmaiset vasemmistolaiset häntä täällä haukkuvat. "
      Maailman menoa
      230
      2698
    7. Mitä ajattelet aina

      Kun hän tulee näköpiiriin?
      Ikävä
      154
      1899
    8. Luokatonta toimintaa

      Tyrmistyttävää toimintaa Stora Enson korjuu yrittäjältä Hukkajoella. Täyttä piittaamattomuutta laeista ja luontoarvoista
      Suomussalmi
      73
      1748
    9. Ensimmäisestä kohtaamisesta saakka

      minulla on ollut hämmentynyt olo. Miten voit tuntua siltä, että olisin tuntenut sinut aina? Sinun kanssasi on yhtä aikaa
      Ikävä
      14
      1650
    10. Maailmankuulu homopingviini on kuollut

      Minä niin toivoin että pariskunta olisi saatu kunniavieraiksi ensi kesän Prideen. 💔 "Maailmankuulu homopingviini on k
      Lapua
      6
      1443
    Aihe