|
[ edit @ 13.04.2005. 13:39 ] @
| Napisati rekurzivnu funkciju koja će odrediti koji se znak u nekom sortiranom znakovnom polju dimenzije n+1 najčešće pojavljuje. Izlazni argument je nađeni znak, a funkcija vraća broj pojavljivanja tog znaka. Prototip funkcije je:
int mode (char *tekst, int n, char *znak);
Za li ko ovo?
|
[ _owl_ @ 13.04.2005. 14:55 ] @
Za pocetak mozes da napises i nerekurzivnu funkciju cisto da vidis kako sve to radi (to pretpostavljam znas). Poenta je da ako se neki znak ponavlja onda on moze da se nalazi samo ispred istog takvog znaka (posto je string sortiran). Kod rekurzivne funkcije treba stalno da pozivas mode((tekst+1), n, znak) dok ne dodjes do kraja stringa, tada ces se vratiti unazad i utvrditi koji se znak najvise puta ponavlja (za ovo je potrebno da unutar same funkcije pamtis trenutno najcesce ponavljani znak kao i koliko se puta pojavio do sada).
[ Mihajlo Cvetanović @ 13.04.2005. 15:46 ] @
Mislim da ovo ne moze da se resi potpuno matematicki rekurzivno (tj. jedan znak - jedan poziv funkcije). Za tako nesto kao da nedostaje jedan parametar. Ovo moze da se resi ako se funkcija rekurzivno poziva za grupu istih znakova. Znaci:
- ako je znak ' ' onda vracas 0 i izlaznu vrednost ' ',
- brojis iste znakove sve dok ne dodjes do razlicitog znaka,
- za razlicit znak rekurzivno pozoves funkciju,
- povratni rezultat je maksimum od onoga sto je izbrojano i sto je rekurzivni poziv vratio, izlazna vrednost odgovara maksimumu.
[ Alef @ 13.04.2005. 16:20 ] @
Ovo ja za opšti string… Za sortirani može da se optimizuje…
Code:
int func(char *s, char znak)
{
if (*s == '\n')
return 0;
else if (*s != znak)
return func(s+1, znak);
else return 1+func(s+1, znak);
}
[ RnD57 @ 13.04.2005. 21:19 ] @
@Alef: Ovo je funkcija za rekurzivno brojanje odredjenog znaka u nizu znakova. Ti ni u jednom trenutku ne menjash vrednost parametra 'char znak', sve shto vracash je broj ponavljanja znaka koji je zadat pri prvom pozivu funkcije.
Izgleda da si pogreshno skont'o...
[ Alef @ 13.04.2005. 23:42 ] @
Tako mi i treba kad me mrzi da pročitam do kraja  . Evo jedna malo nakaradna verzija, dok ne smislim bolje  .
Code:
int func(char *s, char c)
{
static int max = 0, tmp = 0, znak = 0;
if (*s == c) {
tmp++;
func(s+1, c);
} else {
if (max < tmp) {
max = tmp;
znak = *(s-1);
}
tmp = 1;
if (*s != '\0') func(s+1, *s);
}
return znak;
}
[ --SOULMaTe-- @ 14.04.2005. 00:57 ] @
Evo mog jos nakaradnijeg resenja, ali radi. E posto nisam c-jas nemojte mi zameriti. I nisam uspeo da napravim da i sacuvam koje je to slovo. ???
Code:
int niz[256];
int func(int *niz,char *s, int n , int pos, int max , char maxznak)
{
*(niz+ *(s+pos))= *(niz+ *(s+pos)) + 1;
if (pos == n)
{
if (*(s+pos)== maxznak)
{
return max+1;
}
else
{
if (*(niz+ *(s+pos))>max)
{
return *(niz+ *(s+pos));
}
else
{
return max;
}
}
}
{
if (*(s+pos)== maxznak)
{
return func(niz,s,n,pos+1, max + 1 ,maxznak);
}
else
{
if (*(niz+ *(s+pos))>max) return (func(niz,s,n,pos+1, *(niz+ *(s+pos)), *(s+pos)));
else return func(niz, s,n,pos+1, max ,maxznak);
}
}
}
[ the_beast @ 14.04.2005. 11:40 ] @
Evo ti moje resenje, nije cista rekurzija, ali mislim da je to otprilike to.
Code:
int mode (char *tekst, int n, char *znak)
{
int bp, nextbp;
char c;
bp=0;
c=*tekst;
while(c==*tekst)
{
bp++;
tekst++;
n--;
if (n==0)
{
*znak=c;
return bp;
}
}
nextbp=mode(tekst,n,znak);
if(bp>=nextbp)
{
*znak=c;
return bp;
}
else
return nextbp;
}
Kad ga isprobas recimo sa:
Code:
int main(void)
{
char cMax;
int bpMax;
char nizslova[]="aaabccccddeeeee fffffff";
char *pok;
pok=nizslova;
bpMax=mode(pok,23,&cMax);
printf("Najvise se pojavljuje znak %c i to %d puta.",cMax,bpMax);
return 0;
}
dobijes ono sto treba
[ rumpl @ 14.04.2005. 12:38 ] @
Rumpl
int mode(char *str, int n, char *c)
{
static int max = 0;
static int maxcur = 1;
if(!str[n])
return(max);
if(str[n] == str[n+1])
maxcur++;
if(str[n] != str[n+1] && max < maxcur)
{
max = maxcur;
maxcur = 1;
*(c) = str[n];
}
return(mode(str, n+1, c));
}
int main()
{
int i;
char *str;
char a;
str = "aabbbc";
i = mode(str, 0, &a);
printf("%d %c\n", i, a);
return(0);
}
--------------------------------------------------------------------------------
alexscott
int mode(char *str, int n, char *pmax)
{
static int max = 0;
static int cur = 1;
if(!n)
*pmax = (( *str ) ? *str : 0);
if( (! *(str+(n++))) || (! *(str+1)) )
return((!max && *str) ? 1 : max);
if(max < (cur = ( *(str+n-1) == *(str+n) ) ? cur+1 : 1))
{
max = cur;
*pmax = *(str+n);
}
return(mode(str, n, pmax));
}
int main(int argc, char **argv)
{
char c;
printf("%d %c\n", mode(((argc-1) ? argv[1] : ""), 0, &c), c);
return(0);
}
Evo dva resenja na vas zadtak, malko smo se zekili, primeticete da je jedan kod razunljiviji od drugog...
Pozdrav, saljite nam jos zanimljivih zadatcica
[ rumpl @ 14.04.2005. 12:56 ] @
Ups, zaboravili smo [ code ] [ / code ]....
Rumpl :
Code:
int mode(char *str, int n, char *c)
{
static int max = 0;
static int maxcur = 1;
if(!str[n])
return(max);
if(str[n] == str[n+1])
maxcur++;
if(str[n] != str[n+1] && max < maxcur)
{
max = maxcur;
maxcur = 1;
*(c) = str[n];
}
return(mode(str, n+1, c));
}
int main()
{
int i;
char *str;
char a;
str = "aabbbc";
i = mode(str, 0, &a);
printf("%d %c\n", i, a);
return(0);
}
__________________________________________________________________________
alexscott:
Code:
int mode(char *str, int n, char *pmax)
{
static int max = 0;
static int cur = 1;
if(!n)
*pmax = (( *str ) ? *str : 0);
if( (! *(str+(n++))) || (! *(str+1)) )
return((!max && *str) ? 1 : max);
if(max < (cur = ( *(str+n-1) == *(str+n) ) ? cur+1 : 1))
{
max = cur;
*pmax = *(str+n);
}
return(mode(str, n, pmax));
}
int main(int argc, char **argv)
{
char c;
printf("%d %c\n", mode(((argc-1) ? argv[1] : ""), 0, &c), c);
return(0);
}
[ Mihajlo Cvetanović @ 14.04.2005. 13:48 ] @
Statičke promenljive u telu rekurzivne funkcije najčešće nisu dobra ideja. Šta ako neko želi da pozove funkciju iz više niti? U komplikovanijim slučajevima su i izvor bagova.
[ RnD57 @ 15.04.2005. 02:34 ] @
Evo i moje verzije. Proizvod chamotinje na predavanjima juche. pri prvom pozivu treba za 'n' proslediti 1, a za 'znak' neki char koji sigurno nece biti prvi u stringu [npr. '$']. Tekst se zavrshava znakom '$', a mozhesh i da promenish.
Code:
int mode (char *tekst, int n, char *znak) {
if (*znak == tekst[0]) n++;
else n=1;
int a=0;
*znak=tekst[0];
if (tekst[0] != '$') a = mode (tekst+1, n, znak);
if (n > a) return n;
else return a;
}
[ rumpl @ 15.04.2005. 08:15 ] @
Mihajlo, slazem se sa tobom, ali ako pogledas, mi smo jedini koji su stvarno napravili pravu rekurzivnu funkciju sa prototipom koji je bio postavljen, ne kazem da su ostale lose, samo sto nije to bio zadatak...
Pozdrav
[ Mihajlo Cvetanović @ 15.04.2005. 09:33 ] @
Jedno glupo pitanje: da li mi treba da saljemo ovde gotova resenja, ili
uputstva i smernice?
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|