Springen naar inhoud

While en for lus


  • Log in om te kunnen reageren

#1

velgrem1989

    velgrem1989


  • >100 berichten
  • 228 berichten
  • Ervaren gebruiker

Geplaatst op 22 juni 2008 - 21:24

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

Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

jhnbk

    jhnbk


  • >5k berichten
  • 6905 berichten
  • VIP

Geplaatst op 22 juni 2008 - 21:36

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.

#3

qrnlk

    qrnlk


  • >5k berichten
  • 5079 berichten
  • Lorentziaan

Geplaatst op 22 juni 2008 - 22:52

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

#4

Cycloon

    Cycloon


  • >1k berichten
  • 4810 berichten
  • VIP

Geplaatst op 23 juni 2008 - 08:57

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.

Veranderd door Cycloon, 23 juni 2008 - 09:04


#5

jhnbk

    jhnbk


  • >5k berichten
  • 6905 berichten
  • VIP

Geplaatst op 23 juni 2008 - 09:16

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.

#6

qrnlk

    qrnlk


  • >5k berichten
  • 5079 berichten
  • Lorentziaan

Geplaatst op 23 juni 2008 - 09:59

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

#7

Cycloon

    Cycloon


  • >1k berichten
  • 4810 berichten
  • VIP

Geplaatst op 23 juni 2008 - 10:05

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:

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

Veranderd door Cycloon, 23 juni 2008 - 10:06


#8

Vladimir Lenin

    Vladimir Lenin


  • >250 berichten
  • 829 berichten
  • Ervaren gebruiker

Geplaatst op 09 oktober 2008 - 23:41

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-- (Владимир Ильич Ульянов)

#9

zpidermen

    zpidermen


  • >1k berichten
  • 1623 berichten
  • Ervaren gebruiker

Geplaatst op 10 oktober 2008 - 06:30

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

#10

qrnlk

    qrnlk


  • >5k berichten
  • 5079 berichten
  • Lorentziaan

Geplaatst op 10 oktober 2008 - 08:18

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

#11

Vladimir Lenin

    Vladimir Lenin


  • >250 berichten
  • 829 berichten
  • Ervaren gebruiker

Geplaatst op 10 oktober 2008 - 10:50

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-- (Владимир Ильич Ульянов)

#12

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 10 oktober 2008 - 11:31

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

#13

zpidermen

    zpidermen


  • >1k berichten
  • 1623 berichten
  • Ervaren gebruiker

Geplaatst op 10 oktober 2008 - 11:40

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

#14

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 10 oktober 2008 - 13:13

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

Wiki is je vriend.

#15

qrnlk

    qrnlk


  • >5k berichten
  • 5079 berichten
  • Lorentziaan

Geplaatst op 10 oktober 2008 - 13:49

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





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures