|
| Faktorial Værdi Fra : lars09 |
Dato : 20-09-02 15:52 |
|
HEj
Håber der er nogle som kan hjælpe
Hvis jeg skal lave et c++ program i console mode, hvor jeg skal bruge
den faktoriale værdi af et vilkårligt tal. hvordan skal jeg gører dette
eks. 5 og dets faktoriale værdi = 5 * 4 * 3 *2 * 1 eller
n-1
--
Leveret af:
http://www.kandu.dk/
"Vejen til en hurtig løsning"
| |
Bertel Lund Hansen (20-09-2002)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 20-09-02 15:45 |
|
lars09 skrev:
>Hvis jeg skal lave et c++ program i console mode, hvor jeg skal bruge
>den faktoriale værdi af et vilkårligt tal. hvordan skal jeg gører dette
Skriv en funktion der beregner den.
// Virker ikke for 0 og går i spåner ved negative tal.
int fakultet (int tal) {
if (tal=1) return 1;
return tal*fakultet(tal-1);
}
--
Bertel
http://bertel.lundhansen.dk/ FIDUSO: http://fiduso.dk/
| |
Morten F. Hansen (20-09-2002)
| Kommentar Fra : Morten F. Hansen |
Dato : 20-09-02 16:33 |
|
"Bertel Lund Hansen" <nospam@lundhansen.dk> wrote:
> // Virker ikke for 0 og går i spåner ved negative tal.
> int fakultet (int tal) {
> if (tal=1) return 1;
> return tal*fakultet(tal-1);
> }
Så kunne man måske bruge:
if (tal <= 1) return 1;
så virker den nemlig som den skal for nul og går ikke død hvis "tal" er
negativt.
| |
Morten F. Hansen (20-09-2002)
| Kommentar Fra : Morten F. Hansen |
Dato : 20-09-02 16:41 |
|
> "Bertel Lund Hansen" <nospam@lundhansen.dk> wrote:
> > // Virker ikke for 0 og går i spåner ved negative tal.
> > int fakultet (int tal) {
> > if (tal=1) return 1;
> > return tal*fakultet(tal-1);
> > }
> Så kunne man måske bruge:
> if (tal <= 1) return 1;
> så virker den nemlig som den skal for nul og går ikke død hvis "tal" er
> negativt.
Der skal forresten også stå "tal == 1" og ikke "tal = 1" nu vi er igang
| |
Bertel Lund Hansen (20-09-2002)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 20-09-02 16:54 |
|
Morten F. Hansen skrev:
>Så kunne man måske bruge:
>if (tal <= 1) return 1;
Ja, men hvis man ved at man kun benytter positive tal, er det
hurtigere uden. Og du har ret i at der skulle have stået ==. Jeg
er vokset op med sprog der ikke brugte det tegn.
--
Bertel
http://bertel.lundhansen.dk/ FIDUSO: http://fiduso.dk/
| |
Anders Bo Rasmussen (20-09-2002)
| Kommentar Fra : Anders Bo Rasmussen |
Dato : 20-09-02 17:10 |
|
On Fri, 20 Sep 2002 17:53:57 +0200,
Bertel Lund Hansen <nospam@lundhansen.dk> wrote:
>>Så kunne man måske bruge:
>>if (tal <= 1) return 1;
>
> Ja, men hvis man ved at man kun benytter positive tal, er det
> hurtigere uden. Og du har ret i at der skulle have stået ==. Jeg
> er vokset op med sprog der ikke brugte det tegn.
Nu var det et vilkårligt tal der blev spurgt om, så rutinen bør kunne
tage fakultet(0).
--
Anders Bo Rasmussen
* Du har en solid edb-mæssig basisuddannelse EDB-assistent eller ligende.
* Du er serviceminded og selvstændig. Du har erfaring med indkøb, opsætning og
bruger support.
| |
Morten F. Hansen (20-09-2002)
| Kommentar Fra : Morten F. Hansen |
Dato : 20-09-02 17:14 |
|
> >Så kunne man måske bruge:
> >if (tal <= 1) return 1;
> Ja, men hvis man ved at man kun benytter positive tal, er det
> hurtigere uden.
Jeg tror det er det samme.
== bliver sikkert oversat til noget i retning af:
; hop forbi return hvis tal ikke er 1
cmp ax, 1
jne @skip_return_statement
mens <= bliver oversat til:
; hop forbi return hvis tal er større end 1
cmp ax, 1
jg @skip_return_statement
Begge jump-instruktioner har samme clocks (ihvertfald på de Intel CPU'er jeg
kender).
| |
Morten F. Hansen (20-09-2002)
| Kommentar Fra : Morten F. Hansen |
Dato : 20-09-02 18:04 |
|
> Ja, men hvis man ved at man kun benytter positive tal, er det
> hurtigere uden. Og du har ret i at der skulle have stået ==. Jeg
> er vokset op med sprog der ikke brugte det tegn.
Hvis det er hastigheden man går efter kan man jo bruge følgende:
int fast_fakultet(int n)
{
static int lookup[13] = {
1, 1, 2, 6, 24, 120, 720, 5040, 40320,
362880, 3628800, 39916800, 479001600
};
if (n < 0 || n > 12)
return 0;
else
return lookup[n];
}
Hvis man arbejder på en maskine med signed 32-bit ints, dør den jo alligevel
efter 12!
| |
Anders Bo Rasmussen (20-09-2002)
| Kommentar Fra : Anders Bo Rasmussen |
Dato : 20-09-02 16:42 |
|
On Fri, 20 Sep 2002 16:44:48 +0200,
Bertel Lund Hansen <nospam@lundhansen.dk> wrote:
>>Hvis jeg skal lave et c++ program i console mode, hvor jeg skal bruge
>>den faktoriale værdi af et vilkårligt tal. hvordan skal jeg gører dette
>
> Skriv en funktion der beregner den.
>
> // Virker ikke for 0 og går i spåner ved negative tal.
> int fakultet (int tal) {
> if (tal=1) return 1;
Her returnerer vi altid 1.
> return tal*fakultet(tal-1);
> }
fakultet(0) går i uendelig løkke.
--
Anders Bo Rasmussen
* Du har en solid edb-mæssig basisuddannelse EDB-assistent eller ligende.
* Du er serviceminded og selvstændig. Du har erfaring med indkøb, opsætning og
bruger support.
| |
lars09 (20-09-2002)
| Kommentar Fra : lars09 |
Dato : 20-09-02 17:42 |
|
Tak for svaret Anders Bo Rasmussen.
--
Leveret af:
http://www.kandu.dk/
"Vejen til en hurtig løsning"
| |
Ulrik Magnusson (21-09-2002)
| Kommentar Fra : Ulrik Magnusson |
Dato : 21-09-02 10:34 |
|
Bertel Lund Hansen wrote:
> Skriv en funktion der beregner den.
>
> // Virker ikke for 0 og går i spåner ved negative tal.
> int fakultet (int tal) {
> if (tal=1) return 1;
> return tal*fakultet(tal-1);
> }
Det var måske på sin plads også at præsentere den ikke-rekursive:
size_t fakultet( size_t tal )
{
size_t res = 1;
while( tal > 0 )
{
res *= tal;
tal--;
}
return res;
}
Ulrik Magnusson
| |
Jens Axel Søgaard (21-09-2002)
| Kommentar Fra : Jens Axel Søgaard |
Dato : 21-09-02 14:31 |
|
Ulrik Magnusson wrote:
> Bertel Lund Hansen wrote:
>
>> Skriv en funktion der beregner den.
>>
>> // Virker ikke for 0 og går i spåner ved
>> negative tal. int fakultet (int tal) {
>> if (tal=1) return 1;
>> return tal*fakultet(tal-1);
>> }
>
> Det var måske på sin plads også at præsentere den ikke-
> rekursive:
Enig.
> size_t fakultet( size_t tal )
> {
> size_t res = 1;
> while( tal > 0 )
> {
> res *= tal;
> tal--;
> }
> return res;
> }
Den oprindelige spørger var vist lige begyndt på C, så her
er en version uden *= og --.
/* fakultet : 0,1,... -> heltal
udregner fakultet af n, altså n*(n-1)*...*3*2*1
eksempler: faktultet(0)=1, fakultet(1)=1, fakultet(5)=120
*/
int fakultet( int n ) {
int resultat = 1;
while( n > 0 ) {
resultat = resultat * n;
n = n - 1;
}
return resultat;
}
Variablen resultat opsamler lidt efter lidt resultatet, for vi ganger et
tal på ad gangen. Man kalder en sådan variabel for en akkumulator.
--
Jens Axel Søgaard
| |
|
|