1 van 3

While en for lus

Geplaatst: zo 22 jun 2008, 22:24
door velgrem1989
Kan iedere while lus ook geschreven woorden als een for lus? (java)

Re: While en for lus

Geplaatst: zo 22 jun 2008, 22:36
door jhnbk
Neen. Volgens mij kan je steeds een while-lus verzinnen die niet als een for kan geschreven worden.

Een oneindige lus lijkt mij met een for niet mogelijk.

Re: While en for lus

Geplaatst: zo 22 jun 2008, 23:52
door qrnlk
Elke for-lus kan als while lus geschreven worden.

Elke while-lus waarbij het aantal herhalingen van te voren berekend kan worden is te vervangen door een for-lus. Het mag niet altijd even efficient zijn maar het is meestal wel mogelijk.

Waar exact de grens ligt wordt bepaald door de semantiek van je for-lus in je taal. Zo kan het bijvoorbeeld een oneindige lus toestaan of niet.

zie ook dit dictaat

Re: While en for lus

Geplaatst: ma 23 jun 2008, 09:57
door Cycloon
jhnbk schreef:Neen. Volgens mij kan je steeds een while-lus verzinnen die niet als een for kan geschreven worden.

Een oneindige lus lijkt mij met een for niet mogelijk.
Jawel kan wel hoor:

for(int i=0;true;i++) {}

Deze zal dus oneindig doorgaan.

In c++ lukt deze ook:

for(; :D {}

Maar ik denk dat in java dit niet kan gebruikt worden.

Re: While en for lus

Geplaatst: ma 23 jun 2008, 10:16
door jhnbk
euhm, een oneindige is dus toch mogelijk. Welke while zou dan niet als een for geschreven kunnen worden?

Re: While en for lus

Geplaatst: ma 23 jun 2008, 10:59
door qrnlk
Stel je hebt een while waarvan je niet weet of deze eindig is of oneindig.

Hoe zou je die willen implementeren als een for?

Als de semantiek van je taal toestaat dat je een oneindige for kunt breken dan zou er volgens mij geen verschil zijn.

Maar wat is op dat moment de semantische betekenis van for? Zou je dat niet beter iets anders kunnen noemen, zoals while of repeat-until?

Daarnaast kun je een vraag zetten bij de nut van een for, vooral in een taal waarin functies of objecten first-class elementen zijn is een for een beetje ridicuul. Meestal kan het veel beter vervangen worden door een map/fold of Iterator's. Vooral omdat de semantiek dan duidelijker is zodat de compiler het beter kan compileren, bijvoorbeeld door het in parallel te verwerken waar mogelijk. Informatie die vaak niet beschikbaar of slechts moeilijk af te leiden is uit een for-loop.

Het zijn allemaal verschillende vormen van iteratie. (In bijvoorbeeld Scheme is zelfs een recursieve functie met een tail-call equivalent met iteratie).

Re: While en for lus

Geplaatst: ma 23 jun 2008, 11:05
door Cycloon
qrnlk schreef:Stel je hebt een while waarvan je niet weet of deze eindig is of oneindig.

Hoe zou je die willen implementeren als een for?
Je hebt altijd wel ergens een conditie die dus moet voldaan zijn om te stoppen met itereren die je kan opgeven.

Ik denk bv aan volgende code:

Code: Selecteer alles

for(int i=0;i<5;i=(i+1)%5) {

if(conditie) break;

}
Je kan dus wel elke while-lus schrijven als een for-lus en omgekeerd. Maar goed, je hebt wel gelijk dat je op deze manier de bedoeling van een for-lus zwaar "verkracht".

Re: While en for lus

Geplaatst: vr 10 okt 2008, 00:41
door Vladimir Lenin
twee dingen:

1) Waarom deze vraag, als je een while-lus nodig hebt schrijf je gewoon een while, en voor een for, een for. Toegegeven in theorie is dit natuurlijk misschien intressant, maar ik denk niet dat je er in de praktijk veel mee opschiet. Bovendien wil ik nog even zeggen dat dit op lage programmeertalen (waarin alles uiteindelijk in wordt omgezet totaal geen effect heeft)

2) Volgens mij lijkt een for(int i = 0; true; i++) geen handig alternatief, wat als bijvoorbeeld i in overflow gaat, ik ken te weinig van java om daar een passend antwoord op te geven, maar op als de compiler het een beetje verkeert naar de lage programmeer taal opzet kan ik je verzekeren dat er vuurwerk bij te pas komt (uiteraard brand je PC niet plat, ik bedoel dat je systeem een error kan geven, afhankelijk van hoe het in de lage programmeertaal is geschreven deze al dan niet fatal kan zijn. In C# en in andere .Net talen wordt for(; :D wel degelijk "geslikt" dus gok ik erop dat java dat ook doet (C# is gebaseerd op Java)

Re: While en for lus

Geplaatst: vr 10 okt 2008, 07:30
door zpidermen
2) Volgens mij lijkt een for(int i = 0; true; i++) geen handig alternatief, wat als bijvoorbeeld i in overflow gaat,
for(int i = 0; true, i = i+0) gaat niet in overflow.

Re: While en for lus

Geplaatst: vr 10 okt 2008, 09:18
door qrnlk
Je kunt natuurlijk ook een tail-call-recursieve functie gebruiken;) Als je compiler aan tail-call-optimalisatie doet zou dat vrijwel dezelfde machine code moeten opleveren als een for-lus. [edit: :D had ik blijkbaar al opgemerkt]

Dat zou wellicht intersant zijn om eens te onderzoeken: Welke machine code genereert de compiler bij een while (true), een for(; :P en een tall-call-recursieve functie?

Re: While en for lus

Geplaatst: vr 10 okt 2008, 11:50
door Vladimir Lenin
for(int i = 0; true, i = i+0) gaat niet in overflow.


zeer juist, maar dan nog vraak ik me af waarom er een iteratie moet staan, toegegeven, de huidige rekenkracht zorgt er wel voor dat je het verschil niet merkt, maar als je laat ons zeggen 100.000.000.000 keer door die for-lus gaat, is het volgens mij wel normaal dat je op den duur iets meer tijd (laat ons zeggen 0,2 seconden) verloren hebt met rekenen.

Je zou die iteratie dan beter kunnen gebruiken voor een variabele in je (gemodificeerde) for-lus

Re: While en for lus

Geplaatst: vr 10 okt 2008, 12:31
door EvilBro
2) Volgens mij lijkt een for(int i = 0; true; i++) geen handig alternatief, wat als bijvoorbeeld i in overflow gaat, ik ken te weinig van java om daar een passend antwoord op te geven
Java gaat gewoon van het grootst mogelijke getal naar het kleinst mogelijke getal.
[edit: icon_redface.gif had ik blijkbaar al opgemerkt]
Dat krijg je vroeg of laat met je 'functionele talen'-verheerlijking. :D

Re: While en for lus

Geplaatst: vr 10 okt 2008, 12:40
door zpidermen
Je kunt natuurlijk ook een tail-call-recursieve functie gebruiken
Wat is een tail-call-recursieve functie? Kun je daar een stukje code bij geven als voorbeeld?

Re: While en for lus

Geplaatst: vr 10 okt 2008, 14:13
door EvilBro
Wat is een tail-call-recursieve functie? Kun je daar een stukje code bij geven als voorbeeld?
Wiki is je vriend.

Re: While en for lus

Geplaatst: vr 10 okt 2008, 14:49
door qrnlk
Wat is een tail-call-recursieve functie? Kun je daar een stukje code bij geven als voorbeeld?
Ik kom er net achter dat het in het Nederlands staartrecursie heet. :D

Zie Staartrecursie