While en for lus

Moderators: jkien, Xilvo

Berichten: 228

While en for lus

Kan iedere while lus ook geschreven woorden als een for lus? (java)

Gebruikersavatar
Berichten: 6.905

Re: While en for lus

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.
Het vel van de beer kunnen verkopen vraagt moeite tenzij deze dood voor je neervalt. Die kans is echter klein dus moeten we zelf moeite doen.

Gebruikersavatar
Lorentziaan
Berichten: 5.079

Re: While en for lus

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
Any sufficiently analyzed magic is indistinguishable from science.

Any sufficiently advanced technology is indistinguishable from magic.



There is no theory of protecting content other than keeping secrets – Steve Jobs

Gebruikersavatar
Berichten: 4.810

Re: While en for lus

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.

Gebruikersavatar
Berichten: 6.905

Re: While en for lus

euhm, een oneindige is dus toch mogelijk. Welke while zou dan niet als een for geschreven kunnen worden?
Het vel van de beer kunnen verkopen vraagt moeite tenzij deze dood voor je neervalt. Die kans is echter klein dus moeten we zelf moeite doen.

Gebruikersavatar
Lorentziaan
Berichten: 5.079

Re: While en for lus

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).
Any sufficiently analyzed magic is indistinguishable from science.

Any sufficiently advanced technology is indistinguishable from magic.



There is no theory of protecting content other than keeping secrets – Steve Jobs

Gebruikersavatar
Berichten: 4.810

Re: While en for lus

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".

Gebruikersavatar
Berichten: 829

Re: While en for lus

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)
"Als je niet leeft zoals je denkt, zul je snel gaan denken zoals je leeft."

--Vladimir Lenin-- (Владимир Ильич Ульянов)

Gebruikersavatar
Berichten: 1.623

Re: While en for lus

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.
Beter kaal als geen haar want een kip snurkt

Gebruikersavatar
Lorentziaan
Berichten: 5.079

Re: While en for lus

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?
Any sufficiently analyzed magic is indistinguishable from science.

Any sufficiently advanced technology is indistinguishable from magic.



There is no theory of protecting content other than keeping secrets – Steve Jobs

Gebruikersavatar
Berichten: 829

Re: While en for lus

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
"Als je niet leeft zoals je denkt, zul je snel gaan denken zoals je leeft."

--Vladimir Lenin-- (Владимир Ильич Ульянов)

Berichten: 7.068

Re: While en for lus

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

Gebruikersavatar
Berichten: 1.623

Re: While en for lus

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?
Beter kaal als geen haar want een kip snurkt

Berichten: 7.068

Re: While en for lus

Wat is een tail-call-recursieve functie? Kun je daar een stukje code bij geven als voorbeeld?
Wiki is je vriend.

Gebruikersavatar
Lorentziaan
Berichten: 5.079

Re: While en for lus

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
Any sufficiently analyzed magic is indistinguishable from science.

Any sufficiently advanced technology is indistinguishable from magic.



There is no theory of protecting content other than keeping secrets – Steve Jobs

Reageer