Rekurziv C fuggvenyt szeretnek irni ami visszateritti egy parameterkent kapott termeszetes szam legkissebb szamjegyet. Pl.234512 => 1. Valaki 1 kodal kisegittene?
int Rekurz(int num, int min)
{
if (0 == num)
return min;
if (min > num % 10)
min = num % 10;
int tmp = Rekurz(num / 10, min);
if (min > tmp)
return tmp;
else
return min;
}
Rekurz(szam, 10), így kell meghívni. Ha a természetes számokat 1-től vesszük, egyébként a 0 külön eset.
2 paraméter kell az egyik paraméter maga a szám aminek a legkisebb számjegyét keressük, a másik paraméter az eddig a jelenleg talált legkisebb szám. A függvény meghívása így fest: legkissebbszamjegy(234512,9).
Az első paraméterbe kapott számot utolsó számjegy nélkül azaz 10-el osztva (maradékosan) adja tovább és a visszatérési érték ez és a 234512 szám utolsó számegyének minimuma.
Mint tisztán matematikailag megfogalmazva ez a függvény, ahol nincsenek ciklusok, a változók nincsenek (pontosabban más értelembe vannak, és nem változnak) Persze ettől el lehet térni c-ben.
Az én megoldásom, a matematikai megközelítésem analógiájára, (0-nál nagyobb számokra működik csak)
int min(int a,int b){
return (a<b) ? a : b;
}
int legkisebbszamjegy(int szam,int eddigilkj){
if (szam>0){
return min(legkisebbszamjegy(szam/10,eddigilkj),min(eddigilkj,szam % 10));}
}
------------
Vagy külön min fgv nélkül (áttekinthetetlenebb, de ugyan az lényegébe):
int legkisebbszamjegy(int szam,int eddigilkj){
if (szam>0){
return ((legkisebbszamjegy(szam/10,eddigilkj)<((eddigilkj<szam % 10) ? eddigilkj : szam % 10)) ? legkisebbszamjegy(szam/10,eddigilkj) : ((eddigilkj<szam % 10) ? eddigilkj : szam % 10));}
}
3. válaszoló nyomán:
#define MIN(a, b) ( ((a) < (b)) ? (a) : (b) )
int Rekurz(int num, int min)
{
if (10 > num)
return MIN(min, num);
return MIN(min, Rekurz(num / 10, MIN(num % 10, min)));
}
Nem a leghatékonyabb (temporális változó nélkül dolgozik, emiatt kétszer hívhatja a Rekurz függvényt), de funkcionális programozás szempontjából "szép".
Funkcionális programozás ahol a függvények matematikai értelemben vett függvények, azaz nincs mellékhatásuk.
"return ((legkisebbszamjegy(szam/10,eddigilkj)<((eddigilkj<sza ..."
Ez egy sor a ";"-ig csak szétszedte az ez az oldal.
@16:24 iostream
Matematikailag nem számít hogy 2x van meghívva... bár lehetett volna temporális változót használnom(de ez nem volt célom) mert nem sérti a funkcionális paradigmát. Egy funkcionális kiértékelő rendszer lehet olyan "okos" hogy 1x számolja ki, hiába így írom (ezt nem a c-re értem)
"#define MIN(a, b) ( ((a) < (b)) ? (a) : (b) )"
Nagyon jó! (Kevesebb zárójellel) én is így írtam, csak a preprocesszált kódot írtam ide, hátha valaki észreveszi hogy így is lehetne.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!