|
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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.
| |
|
|