A következő c++ program rekurziós modszer?
Ha nem akkor miért , és hogyan kéne ? Könyvből tanulok egyedül, igy értettem meg. Kérlek javitsatok ki ha nem jó .
A program fut, Kiirja egy szám, prim számjegyeinek szorzatát.
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int prim(int n)
{int k=1,p ;
if (n==0) return 0;
else
while (n>0)
{ p=n%10;
n=n/10;
if((p==1)||(p==2)||(p==3)||(p==5)||(p==7))
k*=p;
else
k=k;}
return k;
}
int main()
{
int n;
printf("Kerek egy szamot:");
scanf("%d",&n);
printf("A primek szorzata = %d\n",prim(n));
system("pause");
}
"Én úgy értettem, hogy a rekurzió abból áll, hogy felosztom a feladatot al-részekre, amik elvégzik a dolgukat és a main csak bekéri a végeredményt."
Nem.
A rekurzió olyan eljárás, amikor pl. egy függvény a kódjában önmagát hívja meg. A kódod akkor használna rekurziót, ha mondjuk a prim(int n) függvényen belül lenne pl. egy prim(1) hívás.
Ez hátha segít.
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int rek(int x){
if(x<=9&&x==2||x==3||x==5||x==7) return x;
else if (x<=9) return 1;
if(x%10==2||x%10==3||x%10==5||x%10==7) return(x%10)*rek(x/10);
else return rek(x/10);
}
int main(){
int x;
printf("Kerem a szamot x=");scanf("%i",&x);
printf("prim sz szorzat:%i\n",rek(x));
system("pause");
}
igy jó ?
Rekurzívnak mindenképpen rekurzív, illetve első ránézésre úgy tűnik, helyesen is működik.
Azért pár jótanács (nem éppen rekurzió témában):
- kétszer is végigírtál egy olyan sort, amiben ellenőrzöd egy számjegyről, hogy prím-e. Egyszerűsíti és átláthatóbbá teszi a kódot, ha ennek a feltételnek létrehozol egy függvényt. Pl. bool primjegye(int n) {
return (n==2) || (n==3) || (n==5) || (n==7);
}
Az feltételeid pedig valahogy majd így néznek ki:
if (primjegye(x)) {...
if (primjegye(x%10)) {...
Általában ha egy kódrészletet sokszor használsz, célszerű azt egy külön függvénybe kihelyezni, mert később ha módosítani akarod majd a programot, sokkal könnyebben megérted majd, hogyan működött.
- Nem tudom, hogy ez a bemásolás során lett ilyen, vagy eleve így írtad (esetleg a telefonom tördel rosszul), de a programot célszerű valamiféle "style guide" szerint építeni. A fordítónak nem gond, ha így írsz egy kódot:
while( igazeafeltetel (feltetel )) {a=2;if (a ==2){
printf("kiskutya" );}}
Csak kellően nagy projekt esetén már a zárójelpárokat sem találod meg (a lehagyott zárójelek kifejezetten nagy gondot jelentenek ilyen kódban, a fordító ugyanis nem találja meg a hiba helyét), nemhogy átlásd, hogy mi hova tartozik. Sokkal szebb ez így:
while (igazeafeltetel(feltetel) )
{
a = 2;
if (a == 2)
nbsp; {
printf("kiskutya");
}
}
Javaslom, hogy olvass el pár ilyen style guide-ot, és válassz egy olyat, ami tetszik neked, akár módosíthatsz is rajta, ha valamit te máshogy gondolsz, ezek nincsenek kőbe vésve (munkahelyen meg úgyis megmondják, hogy kb. hogy nézzen ki a kód). A lényeg az, hogy következetesen alkalmazd a szabályokat, és átlátható legyen a kód. Ezt célszerű minél előbb elkezdeni. Eleinte még figyelned kell majd rá, hogy szépen tördelj, de egy idő után automatikusan úgy írod majd a kódot, fel sem fog tűnni.
Na, a szépen írt kódot sikerült elrontanom, úgyhogy még egyszer:
while (igazeafeltetel(feltetel) )
{
a = 2;
if (a == 2)
{
printf("kiskutya");
}
}
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!