/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
klassikeren: den rekursive funktion!
Fra : Maya


Dato : 23-11-02 20:23

Hej, håber der er nogen der er kloge nok til at belyse nedenstående.

Den rekursive funktion, ja det er ihvertfald hvad jeg tror jeg har brug for,
men er det nu også lige det?

Sagen er den, at jeg har et array med x-antal strings. Det jeg har brug for
at vide er antallet af forskellige strings der er i arrayet.

arr[0] = "peter"
arr[1] = "Lise"
arr[2] = "Klaus"
arr[3] = "Lise"
arr[4] = "Lise"

ovenstående har jeg brug for giver mig en information på 3 tilbage, da der
er 3 distinct informationer i arrayet. Så jeg skal altså holde arr[0] op
imod arr[1], arr[2], arr[3], arr[4] og arr[1] imod 2, 3, 4......osv. Jeg
tror at det netop er rekursivitet der er brug for her, men jeg kan ikke få
hul på det.

bemærk jeg håndtere ikke pointere og lign. endnu.

Forøvrigt har jeg tildelt arrayet via en løkke, men har været nød til at
lave arr[100] tildeling (ret surt, det gælder vel om at gøre det så slim så
muligt), da mit forsøg på dynamisk array: arr() - gav fejlen: "Size of the
type 'AnsiString()' is unknown or zero". - troede godt man kunne lave dyn.
array på denne måde og så ellers tildele med arr[i] i en løkke til kriterie
falsk.



 
 
Kim Hansen (23-11-2002)
Kommentar
Fra : Kim Hansen


Dato : 23-11-02 20:22

"Maya" <maya@mayadesign.dk> writes:

> Hej, håber der er nogen der er kloge nok til at belyse nedenstående.
>
> Den rekursive funktion, ja det er ihvertfald hvad jeg tror jeg har brug for,
> men er det nu også lige det?
>
> Sagen er den, at jeg har et array med x-antal strings. Det jeg har brug for
> at vide er antallet af forskellige strings der er i arrayet.
>
> arr[0] = "peter"
> arr[1] = "Lise"
> arr[2] = "Klaus"
> arr[3] = "Lise"
> arr[4] = "Lise"
>
> ovenstående har jeg brug for giver mig en information på 3 tilbage, da der
> er 3 distinct informationer i arrayet. Så jeg skal altså holde arr[0] op
> imod arr[1], arr[2], arr[3], arr[4] og arr[1] imod 2, 3, 4......osv. Jeg
> tror at det netop er rekursivitet der er brug for her, men jeg kan ikke få
> hul på det.

Hvis du bruger C++ så kan du lave en map<string,int> (ca.) og anvende
dine strings som nøgler.

Hvis du bruger C er det sikkert nemmere at bruge qsort til at sortere
arr[], og så er det ligetil at hente de forskellige værdier ud.

--
Kim Hansen | |\ _,,,---,,_ | Det er ikke
Dalslandsgade 8, A708 | /,`.-'`' -. ;-;;,_ | Jeopardy.
2300 København S | |,4- ) )-,_. ,\ ( `'-' | Svar _efter_
Phone: 32 88 60 86 | '---''(_/--' `-'\_) | spørgsmålet.

Bertel K. Brander (24-11-2002)
Kommentar
Fra : Bertel K. Brander


Dato : 24-11-02 01:04

Maya wrote:

> Hej, håber der er nogen der er kloge nok til at belyse nedenstående.
>
> Den rekursive funktion, ja det er ihvertfald hvad jeg tror jeg har brug for,
> men er det nu også lige det?
>
> Sagen er den, at jeg har et array med x-antal strings. Det jeg har brug for
> at vide er antallet af forskellige strings der er i arrayet.
>
> arr[0] = "peter"
> arr[1] = "Lise"
> arr[2] = "Klaus"
> arr[3] = "Lise"
> arr[4] = "Lise"
>
> ovenstående har jeg brug for giver mig en information på 3 tilbage, da der
> er 3 distinct informationer i arrayet. Så jeg skal altså holde arr[0] op
> imod arr[1], arr[2], arr[3], arr[4] og arr[1] imod 2, 3, 4......osv. Jeg
> tror at det netop er rekursivitet der er brug for her, men jeg kan ikke få
> hul på det.
>
Jeg mener ikke at du har brug for en rekursiv funktion. Jeg kender ikke så

meget til C++, så jeg har lavet en løsning i C (den vil dog også virke i

C++):


#include <stdio.h>
#include <string.h>

#define NUM_NAME 5

const char *arr[NUM_NAME];

int main(void)
{
int i, j, num;
char arr2[NUM_NAME];

arr[0] = "peter";
arr[1] = "Lise";
arr[2] = "Klaus";
arr[3] = "Lise";
arr[4] = "Lise";

for(i = 0; i < NUM_NAME; i++)
arr2[i] = 1; /* Du kunne bruge TRUE her */

for(num = NUM_NAME, i = 0; i < NUM_NAME; i++)
if(arr2[i] != 0) /* Eller check for FALSE */
for(j = i + 1; j < NUM_NAME; j++)
{
if(!strcmp(arr[i], arr[j]))
{
num--;
/* arr[j] er det samme som arr[i],
så arr[j] skal ikke checkes igen */
arr2[j] = 0;
}
}
printf("Antal forskellige: %d\n", num);
return 0;
}

HTH

/bertel





Claus Rasmussen (24-11-2002)
Kommentar
Fra : Claus Rasmussen


Dato : 24-11-02 06:38

Maya wrote:

> Hej, håber der er nogen der er kloge nok til at belyse nedenstående.
>
> Den rekursive funktion, ja det er ihvertfald hvad jeg tror jeg har brug
> for, men er det nu også lige det?
>
> Sagen er den, at jeg har et array med x-antal strings. Det jeg har brug
> for at vide er antallet af forskellige strings der er i arrayet.
>
> arr[0] = "peter"
> arr[1] = "Lise"
> arr[2] = "Klaus"
> arr[3] = "Lise"
> arr[4] = "Lise"

Du lyder som om, du går i skole et sted. Det ville være rart at vide på
hvilket niveau, så vi ikke præsenterer dig for løsninger som ligger ud
over dit pensum, eller giver dig en løsning, du ikke lærer noget af.

Dit problem kan løses på flere måder. Ingen af dem involverer dog rekur-
sion. En klassisk løsning er at sortere array'et så det kommer til at
se sådan her ud:

arr[0] = "Klaus"
arr[1] = "Lise"
arr[2] = "Lise"
arr[3] = "Lise"
arr[4] = "peter"

Så kan lave et simpelt gennemløb af array'et, hvor du har en variable,
der rummer den sidste (nye) streng, du har set. F.eks "Klaus". Hver
gang du kommer til et nyt element i array'et kigger du på om det rum-
mer en streng forskellig fra den du allerede har ("Klaus"), og hvis det
er tilfældet tæller du en tæller op og overskriver din variabel med den
nye streng, du fandt.

....

> Forøvrigt har jeg tildelt arrayet via en løkke, men har været nød til at
> lave arr[100] tildeling (ret surt, det gælder vel om at gøre det så slim
> så muligt), da mit forsøg på dynamisk array: arr() - gav fejlen: "Size of
> the type 'AnsiString()' is unknown or zero". - troede godt man kunne lave
> dyn. array på denne måde og så ellers tildele med arr[i] i en løkke til
> kriterie falsk.

Du må vise noget kode, hvis vi skal forstå, hvad du mener. Hverken 'arr'
eller 'AnsiString' findes i hverken Standard C eller Standard C++. Jeg ved
i hvert fald ikke, hvad dit problem er.

-Claus


Rasmus Kaae (24-11-2002)
Kommentar
Fra : Rasmus Kaae


Dato : 24-11-02 08:54

Maya wrote:
> Hej, håber der er nogen der er kloge nok til at belyse nedenstående.
>
> Den rekursive funktion, ja det er ihvertfald hvad jeg tror jeg har brug for,
> men er det nu også lige det?
>
> Sagen er den, at jeg har et array med x-antal strings. Det jeg har brug for
> at vide er antallet af forskellige strings der er i arrayet.
>
> arr[0] = "peter"
> arr[1] = "Lise"
> arr[2] = "Klaus"
> arr[3] = "Lise"
> arr[4] = "Lise"

Det nemmeste må da klart være at sortere arrayet og derefter løbe det
igennem - og så vil du kunne gøre det i en fornuftig tidskompleksitet.


Benny Andersen (24-11-2002)
Kommentar
Fra : Benny Andersen


Dato : 24-11-02 12:45

On Sat, 23 Nov 2002 20:23:03 +0100, Maya <maya@mayadesign.dk> wrote:
> Hej, håber der er nogen der er kloge nok til at belyse nedenstående.
>
> Den rekursive funktion, ja det er ihvertfald hvad jeg tror jeg har brug for,
> men er det nu også lige det?
>
> Sagen er den, at jeg har et array med x-antal strings. Det jeg har brug for
> at vide er antallet af forskellige strings der er i arrayet.
>
> arr[0] = "peter"
> arr[1] = "Lise"
> arr[2] = "Klaus"
> arr[3] = "Lise"
> arr[4] = "Lise"
>
skoleopgave?

Mange problemmer kan drejes, så det løses rekursivt hvis man vil.

<pseudo_mix>

// Lav et array af tilstande for dine strenge
bool isuniq[] = {true,true,true,true,true};

for hvert i fra 0 til 4 hvor isuniq[i] er true
   clear_uniq_higher_than(i)

clear_uniq_higher_than(int u)
{
   for hvert i fra u+1 til 4
      // her kan indsættes et betinget break
      hvis arr[i] indeholder det samme som arr[u]
      {
         // at udfylde selv Maya!
      }   
}

// kan du se hvordan man undgår at hardkode 4 tallet.

</pseudo_mix>

Og de dyre kanonkugler, som map<string,int> eller sortering?
Dem ville jeg nok også selv have anvendt. Lidt af dovenskab.

/Benny



Michael Wojciechowsk~ (24-11-2002)
Kommentar
Fra : Michael Wojciechowsk~


Dato : 24-11-02 14:32

On Sat, 23 Nov 2002 20:23:03 +0100, Maya <maya@mayadesign.dk> wrote:

|> Sagen er den, at jeg har et array med x-antal strings. Det jeg har
|> brug for at vide er antallet af forskellige strings der er i
|> arrayet.

I forbindelse med at lave en løsning i C++, kan du læse:
<http://web.ftech.net/~honeyg/articles/eff_stl.htm>, specielt "3. An
alternative container".

--
Michael Wojciechowski

One must suffer before enlightenment.

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408924
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste