Zum Inhalt springen

Kleines Java Rätsel


Orffi

Empfohlene Beiträge

Hallo zusammen!

Eigentlich könnte das folgende Rätsel auch in das Java-Forum passen, aber da es nicht ernst gemeint ist, habe ich es hier gepostet. Was macht folgende Funktion:


protected static int function ( int v[] )

{

    int I = 0, l = v.length - 1;


    for(;!(v[I]>=v[l--]&&++l==I++);


    return v[l];

}[/code]

Aber nicht einfach in den Compiler stopfen und schauen, was passiert...

Viel Spaß

Jan

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von Orffi



protected static int function ( int v[] )

{

    int I = 0, l = v.length - 1;


    for(;!(v[I]>=v[l--]&&++l==I++);


    return v[l];

}[/code]

[/b]

Hab von Java nicht viel Ahnung und C hab ich auch ne Weile nicht mehr gesehen, aber ich tipp mal die Funktion liefert den letzten Wert aus dem Array V zurück !?

Da die For Schleife nicht viel tut(wenn überhaupt) :confused:

Link zu diesem Kommentar
Auf anderen Seiten teilen

ich kannte eine for-Schleife immer als (z.B.)

for(x; x<5;x++)

aber x und x++ fehlen doch hier und das Semikolon am Ende ? Steht das nicht am Ende der Schleife? ... naja, wie gesagt kenne ich Java nicht wirklich...

moment, ich glaub das mit der Schleife hab ich jetzt kapiert ;)

da passiert das eigentliche ... nur was :confused:

Link zu diesem Kommentar
Auf anderen Seiten teilen

also ich hab das ganze jetzt mal in Delphi umgesetzt, wenn ich es richtig gemacht hab liefert die Funktion den letzten Wert des Arrays zurück.

Merk gerade, das hatte ich ja schonmal getippt ... nur das in der Schleife halt was passiert, nicht wie oben gesagt, aber dennoch liefert meine Schleife den letzten Wert zurück.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von Klotzkopp

Gibt sie das kleinste Element des Arrays zurück?

Wäre auch meine Lösung...

Zur Bestätigung:

import java.sql.*; 
import java.io.*;

public class Test1{

static int n[] = {11,3,5,2,7,9};

public static void main(String args[]){
System.out.println(function(n));
}
protected static int function ( int v[] )
{
int I = 0, l = v.length - 1;
for(;!(v[I]>=v[l--]&&++l==I++) ; ) {
System.out.println("I: "+I);
System.out.println("l: "+l);
};
return v[l];
}
}[/PHP]

liefert als Ausgabe:

I: 1

l: 5

I: 1

l: 4

I: 1

l: 3

I: 2

l: 3

I: 3

l: 3

2

Gruß Jaraz

Link zu diesem Kommentar
Auf anderen Seiten teilen



protected static int function ( int v[] )
{
int I = 0, l = v.length - 1;

for(;!(v[I]>=v[l--]&&++l==I++) ; ) ;

return v[l];
}

[/PHP]

Meine Meinung ist, die Schleife ist nur elendes Blendwerk. Faengt schon damit an, dass die for-Schleife eigentlich eine while-Schleife ist.

Dann hat der Schleifenkopf Nebeneffekte auf l und I. I waechst nach jedem Schleifendurchlauf um 1, l alterniert zwischen length-1 und length -2, also dem letzten und vorletzten Glied des Arrays.

Da die Schleife mit ";" abeschlossen ist, bleibt I irgendwo stehen (wo, das kann man sich mit Hilfe der Bedingung ueberlegen oder kann es auch genauso gut sein lassen), waehrend l immer noch gleich length-1 ist.

Zum Schluss gibt die Funktion einfach das letzte Element des Arrays zurueck, was sie ebenso gut taete, wenn man die Schleife auskommentieren wuerde.

Dummerweise passt das ganz und gar nicht zu Jaraz Listing. :D:D

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von gaiusjUlius

Da die Schleife mit ";" abeschlossen ist, bleibt I irgendwo stehen (wo, das kann man sich mit Hilfe der Bedingung ueberlegen oder kann es auch genauso gut sein lassen), waehrend l immer noch gleich length-1 ist.

Zum Schluss gibt die Funktion einfach das letzte Element des Arrays zurueck, was sie ebenso gut taete, wenn man die Schleife auskommentieren wuerde.

Wenn du den Thread gelesen hättest, wüsstest du das das nicht stimmt. :D

I bleibt genau dann stehen, wenn es gleich l ist und l den Wert im Array liefert, der am kleinsten ist.

Sollte das Array zwei kleinste Werte haben, wird der Wert des höheren Indexes ausgegeben.

Gruß Jaraz

Link zu diesem Kommentar
Auf anderen Seiten teilen

Einige haben es ja schon herausbekommen: die Funktion liefert das kleinste Element in einem Array zurück.

Es stimmt, die for-Schleife ist in Wahrheit eine while-Schleife, aber sie hätte bei weitem nicht so verwirrt. Die Funktionsweise beruht darauf, daß bei einer &&-Verknüpfung der 2. Teil nicht mehr ausgeführt wird, wenn der erste Teil schon false ist, da bei && ja beide Teile true sein müssen, daß mit insgesamt true herauskommt. Wenn der erste Teil schon false ist, barucht man den 2. Teil nict mehr: es kommt auf jeden Fall false heraus. Deswegen wird auch das ganze Array durchgearbeitet.

Jan

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von gaiusjUlius

Aber nettes Beispiel fuer wild optimierende Compiler. ;)

Mmh - es ist vielleicht kleinlich, aber es ist sicherlich nicht eine wilde Optimierung des Compilers, sondern eher ein Feature der Sprache.

Das Ganze nennt sich "Short-Circuiting", eben weil vorher abgebrochen wird und nicht der Rest noch evaluiert wird.

Man kann entweder mit '&' verküpfen, dann wird alles ausgewertet, oder '&&', dann wird bei einem vorderen Teil, der bereits false ist, abgebrochen.

Man kann sich also durchaus darauf verlassen, daß bei der Verwendung von && auch wirklich "Short Circuiting" verwendet wird - man ist nicht auf eine spezielle (und evtl. nicht-standardkonforme) Compiler-Implementation angewiesen.

Evil :cool:

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hm, ich denke nicht, dass Short-Circuing eine typische Spracheigenschaft ist, denn es kommt ja erst beim Maschinen- bzw. Bytecode zum tragen. Ist ja ein technisches Bonbon zur Rechenzeitoptimierung. Die Sprachdefinition muss nur festlegen, ob so etwas stattfindet oder nicht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hm, ich denke nicht, dass Short-Circuing eine typische Spracheigenschaft ist, denn es kommt ja erst beim Maschinen- bzw. Bytecode zum tragen. Ist ja ein technisches Bonbon zur Rechenzeitoptimierung.

Ja, das ist schon klar -- insofern ist es auch ungenau, Short-Circuiting als Sprach-Feature zu bezeichnen.

Mir ging es nur darum, klarzustellen, daß es sich dabei nicht um ein Compilerspezifisches Verhalten handelt.

Es ist eben schon von der Sprache her vorgesehen und nicht einfach ein nettes Feature eines bestimmten Compilers :-))

Die Sprachdefinition muss nur festlegen, ob so etwas stattfindet oder nicht.

Genau - und in diesem Fall ist es festgelegt.

evil

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...