Ohjelmoin pari päivää sitten pienen ohjelman, joka laskee kertoman terminaalista tai komentokehoitteesta Windows-ympäristössä parametrina annetusta luvusta.
Lisäsin jakoon C-koodini Pastebiniin, jos joku haluaa kääntää ohjelman esimerkiksi Linuxille, Winkkarille, tai muuten vain haluaa tarkastella sitä, tai jopa kehittää.
Paljon vähemmällä koodilla kyseistä kertoma-laskenta-"ongelmaa" lienee mahdotonta ratkaista
Kertoman C-koodi terminaalista annetusta parametrista
19
486
Vastaukset 19
Niin tosiaan, suora linkki koodiin on
https://pastebin.com/xdivX5kS- Anonyymi
QT on hyvä alusta tehdä samaa ohjelmaa eri alustoille.
- Anonyymi
Kertoman laskeminen tuskin tarvitsee rekursiota. Tuohan aiheuttaa pinon ylivuodon, teoriassa, kun argumenttina annettu luku on suuri.
else
{
int tulos;
for(tulos = 1, input = atoi(argv[1]); input > 1; tulos *= input--);
printf("%d",tulos);
}Jos mielestäsi ei tarvitse rekursiota, niin voitko esittää oman ratkaisusi, pistä vaikka koodi Pastebiniin anonyymina, jollet ole rekannut itseäsi sinne sisään.
Tuo koodiesityksesi on vaikeasti ymmärrettävissä, vaikka siitä saakin idean irti ehkä. Vähän selvennystä kaipaan, sain tuosta sen käsityksen, että yrität laskea lopputuloksen for-silmukassa sen sijaan, että kutsuisit kertoma-metodia rekursiivisesti. En saa ihan muuta ideaa tuosta esimerkistä, kun siinä on niin paljon syntaksivirheitä. Pistä oma ratkaisusi vaikka anonyymisti Pastebiiniin ja koodi jakoon?
Jos ymmärsin oikein, että for-silmukassa lasket kertomaa, niin tuo ei ole lainkaan uudelleenkäytettävä ratkaisu, joka rikkoo ohjelmoinnin kultaista sääntöä, että koodin tulee olla uudelleen käytettävää. (reusable) Jos tarvitset ohjelmassasi usein laskea kertoman, tuossa sinun ratkaisussasi joudut kirjoittamaan tuon for-silmukan joka kerta uudelleen, joka viittaa proseduraalisen paradigman suuntaan, joten järkevintä on mennä suoraan niin lähelle juuria, että kirjoittaa minimimäärän tarvittavat koodirivit uudelleenkäytetäväksi metodiksi, niin säästyy aikaa, rahaa ja mielenterveys.
Kirjoitin tuosta joskus "Kertoma Python"illa -artikkelinkin tietokoneblogiini, jonka osoite on .
https://tietokoneblogi.wordpress.com/2019/01/17/python-kertoma/- Anonyymi
Joo, kyllä tuo loopilla on järkevämpi tehdä, rekursio on turhaa kikkailua ja se myös tuhlaa koneen resursseja. Toki se looppi olla funktiossakin, jota voi kutsua ihan samalla tavalla kuin rekursiivistakin funktiota.
- Anonyymi
Anonyymi kirjoitti:
Joo, kyllä tuo loopilla on järkevämpi tehdä, rekursio on turhaa kikkailua ja se myös tuhlaa koneen resursseja. Toki se looppi olla funktiossakin, jota voi kutsua ihan samalla tavalla kuin rekursiivistakin funktiota.
Tuolla esimerkki looppi/funktio -tyyppisestä toteutuksesta.
http://codepad.org/hnEQvoL9 - Anonyymi
Tuossa nuo kolme riviä {} sisällä on aivan toimivaa. Voi laittaan esim. main() funktion sisään. En ole itse käyttänyt C-kieltä, enkä paljon muutakaan, mutta tuo kyllä kääntyy päässä toimivaksi tehtäväsarjaksi :)
- Anonyymi
Anonyymi kirjoitti:
Tuossa nuo kolme riviä {} sisällä on aivan toimivaa. Voi laittaan esim. main() funktion sisään. En ole itse käyttänyt C-kieltä, enkä paljon muutakaan, mutta tuo kyllä kääntyy päässä toimivaksi tehtäväsarjaksi :)
Sen sijaan rekursio vaatisi harjoittelua. Luulen että siihenkin tottuisi.
Hasssua kun katsoi Numberphile videota jossa matemaatikko kirjoitti pienen rekursiivisen ohjelman Pythonilla ja se mietti toimiikohan tämä, olisi pitänyt kirjoittaa tämä valmiiksi ennen kuvausta. Matemaattikot ilmeisesti käyttävät enemmän luonnostaan rekursiota, kun matematiikassa on vastaavaa.
Toinen oli ohjelmointikurssilla (cs 106B tai X) maininta että yleensä joko mietitään joko miksiköhän tämä toimii tai sitten miksikö ei. Eli ei jokaiselle fiksummallekaan ole itsestään selvää ilman harjoitusta.
Kannattaisi ehtä treenata :) - Anonyymi
Windows-ympäristössä pinon ylivuotoa ei kovin helposti pääse sattumaan. Taskin pino on varsin suuri ja kokoa voidaan vieläpä kasvattaa ajonaikaisesti tarpeen mukaan.
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/resetstkoflw?view=vs-2019
Pinon kuormittaminen ja hallitsematon rekursio ovat kuitenkin huonoja tapoja ajatellen koodin luotettavuutta ja siirrettävyyttä.
Microsoftin C-kirjastossa oli aikaisemmin stackavail() funktio, jolla vapaan pinon määrän sai kätevästi selvitettyä. Funktio poistui ilmeisesti samalla kun em. pinon koon kasvattaminen tuli mahdolliseksi. Tietääkö joku korviketta tälle funktiolle?
Tosta rekursiosta vielä, että se on yksi tietojenkäsittelyn perusopintojen vaikeimmista asioista ymmärtää, vaikka tajuaisi muutenkin jotain muuta, kuin kirjoittaa suoli24-palstalle irrelevanttia matskua anonyymina.
- Anonyymi
Mielestäni rekursio on ihan simppeli juttu. Siinähän vaan kutsutaan itseään. Esimerkiksi pointtereiden hallinta on C-kielessä paljon vaikeammin ymmärrettävää, kuten **ptr, joka on pointteri pointteriin.
Jokaisen pääkoppa tietysti käsittelee asioita eri tavoin. Sen vuoksi ohjelmoinnista vänkääminen on aika joutavaa ajanhukkaa. - Anonyymi
Relevanttia on mielestäni arvioida onko rekursio (muuten kuin harjoitusmielessa) järkevää tai tarpeellista jossain tietyssä tehtävässä.
Rekursion harjoitustehtävät ovat monesti sellaisia että niissä ei kannatttaisi käyttää rekursiota. Mutta kun ilmeisesti halutaan helpohkoja ja tutun tuntuisia harjoituksia. Esim hakemiston läpikäynti voisi olla motivoituneempi esimerkki..
Relevanttia on mielestäni tuoda esiin rekursion vaatima harjoitus useimmille meistä, jotka eivät ole erityislahjakkaita siihen sopivalla tavalla.
ps rekursiossa voi käyttää ns. dynaamista ohjelmointia, joka ei taida tarkoittaa muuta kuin laskettujen tulosten tallentamista ja hakemista siten ettei tarvitse laskea uudestaan jo laskettua"haaraa". (kertomassa ei voi hyödytää)
https://www.quora.com/What-is-the-difference-between-dynamic-programming-and-recursion
(tuossa kysymys "väärä") - Anonyymi
Anonyymi kirjoitti:
Relevanttia on mielestäni arvioida onko rekursio (muuten kuin harjoitusmielessa) järkevää tai tarpeellista jossain tietyssä tehtävässä.
Rekursion harjoitustehtävät ovat monesti sellaisia että niissä ei kannatttaisi käyttää rekursiota. Mutta kun ilmeisesti halutaan helpohkoja ja tutun tuntuisia harjoituksia. Esim hakemiston läpikäynti voisi olla motivoituneempi esimerkki..
Relevanttia on mielestäni tuoda esiin rekursion vaatima harjoitus useimmille meistä, jotka eivät ole erityislahjakkaita siihen sopivalla tavalla.
ps rekursiossa voi käyttää ns. dynaamista ohjelmointia, joka ei taida tarkoittaa muuta kuin laskettujen tulosten tallentamista ja hakemista siten ettei tarvitse laskea uudestaan jo laskettua"haaraa". (kertomassa ei voi hyödytää)
https://www.quora.com/What-is-the-difference-between-dynamic-programming-and-recursion
(tuossa kysymys "väärä")Fraktaaleiden piirtäminen taitaa olla malliesimerkki rekursioiden käytöstä.
Anonyymi kirjoitti:
Relevanttia on mielestäni arvioida onko rekursio (muuten kuin harjoitusmielessa) järkevää tai tarpeellista jossain tietyssä tehtävässä.
Rekursion harjoitustehtävät ovat monesti sellaisia että niissä ei kannatttaisi käyttää rekursiota. Mutta kun ilmeisesti halutaan helpohkoja ja tutun tuntuisia harjoituksia. Esim hakemiston läpikäynti voisi olla motivoituneempi esimerkki..
Relevanttia on mielestäni tuoda esiin rekursion vaatima harjoitus useimmille meistä, jotka eivät ole erityislahjakkaita siihen sopivalla tavalla.
ps rekursiossa voi käyttää ns. dynaamista ohjelmointia, joka ei taida tarkoittaa muuta kuin laskettujen tulosten tallentamista ja hakemista siten ettei tarvitse laskea uudestaan jo laskettua"haaraa". (kertomassa ei voi hyödytää)
https://www.quora.com/What-is-the-difference-between-dynamic-programming-and-recursion
(tuossa kysymys "väärä")"Relevanttia on mielestäni arvioida onko rekursio (muuten kuin harjoitusmielessa) järkevää tai tarpeellista jossain tietyssä tehtävässä."
Yleensä rekursio on se paras tapa millä saadaan ongelma ratkaistua siististi funktionaalisesti.
Lähinnä C-kieli on tässä se ongelma kun siinä tulee se pinon ylivuoto jos rekursiota on liikaa, että pitää varmistaa että pahimmassa tapauksessa näin ei pääse käymään, esimerkiksi silloin jos käydään jotain puuta läpi ja puu epätasapainossa. Sitten pitää ratkoa hankalammin jos rajat tulee vastaan.Anonyymi kirjoitti:
Mielestäni rekursio on ihan simppeli juttu. Siinähän vaan kutsutaan itseään. Esimerkiksi pointtereiden hallinta on C-kielessä paljon vaikeammin ymmärrettävää, kuten **ptr, joka on pointteri pointteriin.
Jokaisen pääkoppa tietysti käsittelee asioita eri tavoin. Sen vuoksi ohjelmoinnista vänkääminen on aika joutavaa ajanhukkaa.No joo, kesän alussa aloitin opiskelemaan C-kieltä, ja luin siitä kaksi kirjaakin sen jälkeen, kun olin ottanut kieltä haltuun netin kautta. Noi osoittimet,, pointterit on munkin mielestä rekursiota hankaalampia tajuta, ja ne on täysin olennaisia hallita, jos haluaa ohjelmoida C:llä jotain.
Olen kuullut, että noi pointterit ja pointterit pointtereihin tuottaa vielä kokeneillekin ohjelmoijille vaikeuksia.
Pahimmassa tapauksessa ohjelma kaatuu, jos on jäänyt jokin huomaamatta. On niitäkin esimerkkejä, että jokin mielettömän paljon maksanut avaruuslento-projekti on kaatunut alkumetreillä ohjelmointivirheen takia. Tuollaisessa avaruuslennolla käytettävä softa on yksi kriittisimpiä sen suhteen, että sen pitäisi toimia aukottomasti.- Anonyymi
jerzunposti kirjoitti:
No joo, kesän alussa aloitin opiskelemaan C-kieltä, ja luin siitä kaksi kirjaakin sen jälkeen, kun olin ottanut kieltä haltuun netin kautta. Noi osoittimet,, pointterit on munkin mielestä rekursiota hankaalampia tajuta, ja ne on täysin olennaisia hallita, jos haluaa ohjelmoida C:llä jotain.
Olen kuullut, että noi pointterit ja pointterit pointtereihin tuottaa vielä kokeneillekin ohjelmoijille vaikeuksia.
Pahimmassa tapauksessa ohjelma kaatuu, jos on jäänyt jokin huomaamatta. On niitäkin esimerkkejä, että jokin mielettömän paljon maksanut avaruuslento-projekti on kaatunut alkumetreillä ohjelmointivirheen takia. Tuollaisessa avaruuslennolla käytettävä softa on yksi kriittisimpiä sen suhteen, että sen pitäisi toimia aukottomasti." On niitäkin esimerkkejä, että jokin mielettömän paljon maksanut avaruuslento-projekti on kaatunut alkumetreillä ohjelmointivirheen takia."
Ei liittynyt ohjelmointiin, vaan käytettäviin mittayksiköihin. Kivikaudella elävät jenkit eivät ymmärrä vieläkään SI-järjestelmää. Sama se. Niitä on kuitenkin ihmisen tietokoneen käytön historian sivu täysi ohjelmia, jotka eivät toimi, vaan kaatuvat. Esimerkiksi Windows 95 Blue Screen oli aika yleinen silloin, kun se julkaistiin ensimmäisen kerran.
No joo, kaikella kunnioituksella kaikkia ratkaisuja ja koodareiden valintoja kohtaan. Itselläni ensimmäinen rekursiosovellus, jonka kautta tajusin asian, oli klassinen "Hanoin Tornit" -ongelma.
Hanoi Towers ongelman historiahan on se, että alkuperäisessä ongelmassa oli 64-kiekkoa, ja sen ratkaisemiseen ei riitä ihmiselämä.
Ketjusta on poistettu 1 sääntöjenvastaista viestiä.
Luetuimmat keskustelut
Olen nainen pahoillani, että tykkään sinusta niin paljon, että
Haluaisin panna sua. Tuntuu vaan siltä, että olet sen suhteen ihan haluton. Ei minulle riitä pelkkä ystävyyssuhde.801138Puukotus Kajaanissa
Kuka puukotti ja ketä? https://yle.fi/a/74-20247765 Vähemmän yllättäen päihteet mainittu27729- 11702
- 90695
Mieti oikeasti
Ollaan lähes tuntemattomia, mutta samalla on tämä erityinen vuosien tilanne takana, joka on ollut monella tapaa väärin.30687- 46658
kene ajoi "kolarin"?
"Punkaharjulla Luston ja Tuppuranmäen välillä sattui tiistaina aamupäivällä liikenneonnettomuus. Poliisin mukaan Savonl14645Pahin tapa satuttaa toista
On jättää toinen vaille mitään vastausta. Erityisen kipeää se tekee sillon jos toinen ghostaa.68639- 57594
Minulla on joskus ikävä sinua ja ajattelen sinua joskus.. edelleen
Olin joskus niin rakastunut sinuun. Olin onnellinen, että kohdattiin ja kun vain tiesin sinun olevan olemassa. Täytit aj25593- 41571
- 61559
Alkaa jotenkin nyt kuvio hahmottuu täällä
Sellainen vaikutelma tästä alkaa tulla, että täällä on joku pieni porukka, joka tuntee toisensa tai ainakin pelaa samaan82558Jos kaivattusi on
Varattu niin miksi et antaisi asian olla hänen suhteen. Miksi ylipäätään vielä jatkat?46540- 43534
Hyvä on sitten, jos et sitä s*ksiä halua kanssani.
Rakastetaan vaan toisiamme, voin käydä muualla tyydyttämässä fyysisenpuolen tarpeet. Puhumalla tämäkin olisi selvinnyt.129517Kylän tielle remonttia?
Mitäköhän kylän tielle ruvetaan tekemään ku laitettu tuommoset töpsät muutamien suojateitten kohille?13492Nainen, tässä olen kahden vaiheilla
Toinen pitäisi valita ja kummassakin on hyvät ja huonot puolensa. Toinen olisi sellainen pysyvä mutta työläs. Toinen taa52483Suloinen ja herkkä
Toiset huomioiva, räväkkä, yllättävä. Ei sellaisesta voi olla pitämättä.31455Miten vuosien jälkeenkin tunteet voivat olla niin voimakkaat?
Että pelkkä ajatus sinusta täyttää silmät kyynelistä.27447