"We are back" « oc.at

primzahlen berechnen

schoash 17.01.2004 - 19:20 4515 38 Thread rating
Posts

Geigerzeiger

Addicted
Registered: Jan 2004
Location: anywhere
Posts: 449
es soll keine int function sein sondern void!
statt dem break in zeile 6 sollte return; stehen.

Tschuldigung für diese Fehler!

Smoldi

rape diem
Avatar
Registered: Oct 2000
Location: Wien
Posts: 1371
das sieb des eratosthenes wird dir sicher mehr helfen als die lösung der aufgabe...

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Zitat von Smoldi
das sieb des eratosthenes wird dir sicher mehr helfen als die lösung der aufgabe...
nur dass das halt bei den höheren zahlen nicht mehr so die optimale lösung is :p

Smoldi

rape diem
Avatar
Registered: Oct 2000
Location: Wien
Posts: 1371
eh
bis 1000 gehts aber ohne probleme :p
und rekursion ist nie die optimale lösung (performancemässig) ;)

atrox

in fairy dust... I trust!
Avatar
Registered: Sep 2002
Location: HTTP/1.1 404
Posts: 2782
Zitat von Smoldi
...und rekursion ist nie die optimale lösung (performancemässig) ;)
bitte erläutere doch mal, wieso du zu dieser meinung kommst...

um einen allgemeinen rekursiven algorithmus (zb für bäume, graphen, branch&bound, backtracking, quicksort,...) iterativ _schneller_ zu lösen muss man sich oft schon ziemlich anstrengen. nicht selten wird man irgenwelche listen mit indizes, verketete listen oder andere strukturen verwalten müssen. dagegen wird der stack von der cpu verwaltet.

die rekursion ist deutlich mächtiger als eine schleife: jede schleife läßt sich leicht in eine rekursion überführen (auch wenn das nicht immer wirklich sinnvoll erscheint), aber um rekursionen in schleifen zu überführen ist oft deutlich mehr aufwand notwendig.
Bearbeitet von atrox am 19.01.2004, 04:27

MightyMaz

hat nun auch einen Titel
Registered: Feb 2003
Location: .de
Posts: 723
Das Problem bei Rekursionen ist, daß sie bei steigender Komplexität Speichermäßig explodieren. Es gibt zwar keine Variablen, aber der Stack wird zugemüllt (ist ja auch ein Speicher) und irgendwann gibts halt da schon mal nen overflow ;)
Es gibt ganz wenige Ausnahemen, bei denen rekursive Lösungen mit GUTEN Iterativen gleichziehen. Besser sind sie von der Performance her praktisch nie, wenn sich schon mal jemand ne Iterative Lösung ausgedacht hat (und das ist bei Primzahlen ja der Fall ;) ).

Es kann manchmal sehr sehr schwer sein von einer einfach hinzuschreibenden Rekursion auf eine Iteration zu kommen, aber es ist bewiesen, daß jedes Problem iterativ zu lösen ist.
Bearbeitet von MightyMaz am 19.01.2004, 05:09

mg_shadow

live and die in starlight
Avatar
Registered: Aug 2001
Location: A, ST, Bez. Weiz
Posts: 964
also wozu man hier eine rekursion braucht ist mir erlichgesagt nicht klar, das würd auch mit normalen schleifen gehen!
hier braucht die rekursion nur viel speicher und bringt nix!

@smoldi
das sieb ist cool!
wäre programmiertechnisch nicht wirklich komplizierter, aber ich vermute das es schneller ist!
Bearbeitet von mg_shadow am 19.01.2004, 16:16

SoulFly

Bloody Newbie
Registered: Jan 2004
Location: Krenglbeach City
Posts: 14
wieso nimmst du nicht fresserettich's code?
ich hab den (ich bin der "freund" von dem er spricht) mindestens 100 mal durchgetestet ... :rolleyes:

HaBa

Klassenfeind
Avatar
Registered: Mar 2001
Location: St. Speidl / Gle..
Posts: 19855
Wenn eine Rekursion gefordert ist dürfte es sich um eines dieser Anfängerbeispiele handeln bei denen ein spezieller Weg gefordert ist (nehme ich mal an) => würde auch dafürsprechen, denn welcher versierte Coder fragt nach sowas ...

BuSHidO

ist süß
Registered: Jul 2001
Location: galaxie
Posts: 542
Zitat
#include <stdio.h>

int main(void)
{
int year;
int a, b;

for (year = 2001; year < 2050; year += 2)
{
a = 3;
while (a <= (b = year/a))
{
if (a*b == year)
{
printf("%d = %d * %d\n", year, a, b);
a = year;
break;
}
a += 2;
}
if (a != year)
printf ("%d is prime.\n", year);
}
return 0;
}


musst allerdings auf 1000 umschreiben ...

Geigerzeiger

Addicted
Registered: Jan 2004
Location: anywhere
Posts: 449
hmm... hat aber nichts mit rekursion zu tun oder?

samuel

.:: unnahbar ::.
Avatar
Registered: Jul 2000
Location: hagenberg
Posts: 2680
Zitat von mg_shadow
also wozu man hier eine rekursion braucht ist mir erlichgesagt nicht klar

weil dass die aufgabenstellung ist...


und rekursion kann sehr oft sehr schoene loesungen anbieten. sie ist zwar speicherlastiger, kann aber in vielen faellen um soviel schneller sein als jede iteration. (und auch vom code her einfacher verstaendlicher)

mfg sam

atrox

in fairy dust... I trust!
Avatar
Registered: Sep 2002
Location: HTTP/1.1 404
Posts: 2782
wir rätseln ja auch schon die ganze zeit, warum gerade rekursiv primzahlen berechnen,... keine angabe die die vorzüge einer rekursion deutlich macht.

HaBa

Klassenfeind
Avatar
Registered: Mar 2001
Location: St. Speidl / Gle..
Posts: 19855
Ich habs eh schon weiter oben geschrieben, das roch sowas nach Vorgabe ...

alexsb

hmm
Avatar
Registered: Jun 2001
Location: near Graz
Posts: 1566
Also zum Thema Rekursion:
Rekursion ist wunderbar für Definitionen, aber sie ist Speicherplatzmäßig nicht optimal. Ausserdem wird von guten Compilern eine Rekursion in eine Iteration übergeleitet.

Ein Beispiel in der Rekursion katastrophale Auswirkungen auf die Laufzeit hat:
Berechnung der Fibonacci Zahlen mittels der Funktion fib()
fib(6)=fib(5)+fib(4)
=fib(4)+fib(3)+fib(3)+fib(2)
=fib(3)+fib(2)+fib(2)+fib(1)+fib(2)+fib(1)+1
....

In diesem Beispiel wird fib(3) schon 3 mal berechnet.

Also, bei Rekursionen aufpassen.
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz