NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze – Rekurze

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Kit:11.4.2013 13:06

Proč mě chytáš za slovo? To byl jen příklad na to, že výpis podadresáře potřebuji tam, kde mám jméno adresáře. Prostě mám strom typu DOM a chci z něho udělat XML. Ten tvů algoritmus to neudělá.

Rekurzívní (na rozdíl od tvé verze funkční) podoba tvého příkladu:

import java.io.File;

public class ReadDir {
    public static void main(String[] args) {
        listFiles(new File("."));
    }

    public static void listFiles(File file) {
        if (file.isDirectory()) {
            System.out.println("Directory: " + file);
            for (File item : file.listFiles()) {
                listFiles(item);
            }
        } else {
            System.out.println(file);
        }
    }
}
Odpovědět
11.4.2013 13:06
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Kit:11.4.2013 13:07

Java není imperativní jazyk. Asi sis ji s něčím spletl.

Odpovědět
11.4.2013 13:07
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Kit
David Hartinger:11.4.2013 13:34

Pokud vím, imperativní jazyk je jazyk, kde popisujeme postup vedoucí k řešení zadání. To se v Javě děje.

Odpovědět
11.4.2013 13:34
New kid back on the block with a R.I.P
Avatar
Odpovídá na Kit
Luboš Běhounek Satik:11.4.2013 13:36

Ty mě také pořád chytáš za slovo, tak jsem začal také.
Můj předchozí příklad jsem psal z hlavy a moc ho nekontroloval, ale základní myšlenku myslím vystihoval.

Citace: "Prostě mám strom typu DOM a chci z něho udělat XML. Ten tvů algoritmus to neudělá."

  • Proč by to neudělal? Stačí ho jen lehce upravit, tady máš obdobu tvé rekurzivní verze přes zásobník, tentokrát jsem ji i zkoušel spustit, aby jsi neměl výtky...
private static void listFiles(String slozka)
        {
            Stack<String> zasobnik = new Stack<string>();
            zasobnik.Push(slozka);

            while (zasobnik.Count > 0)
            {
                foreach (String dir in Directory.GetDirectories(zasobnik.Pop()))
                {
                    zasobnik.Push(dir);
                    Console.WriteLine("Directory: " + dir);
                    foreach (String file in Directory.GetFiles(dir))
                        Console.WriteLine(file);
                }
            }
        }

Java není imperativní jazyk? Odkdy? :D

Odpovědět
11.4.2013 13:36
https://www.facebook.com/peasantsandcastles/
Avatar
Odpovídá na David Hartinger
Luboš Běhounek Satik:11.4.2013 13:41

V imperativním jazyce říkáš, jak přesně problém řešit, jakými příkazy.

V deklarativním jen definuješ, jaký chceš výsledek, už nedefinuješ, jak ho dosáhnout, sem patří tuším SQL a asi by se sem dal zařadit třeba Prolog.

Odpovědět
11.4.2013 13:41
https://www.facebook.com/peasantsandcastles/
Avatar
Homo
Člen
Avatar
Odpovídá na Kit
Homo:11.4.2013 13:47

Jen pro zajimavost, vypsani slozek v adresari pomoci NIO2 z Javy 7

Path pathToIterate = FileSystems.getDefault().getPath("C:");

DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<Path>(){
    @Override
    public boolean accept(Path entry) throws IOException {
        return Files.isDirectory(entry);
    }
};

try(DirectoryStream ds = Files.newDirectoryStream(pathToIterate, filter)){
    for(Object p : ds){
        System.out.println(p.toString());
    }
} catch (IOException e) {
    e.printStackTrace();
}
Odpovědět
11.4.2013 13:47
1010011 1000101 1011000
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:11.4.2013 14:01

... ale nemá dít. Java je objektový jazyk, nemělo by záležet na pořadí provádění příkazů.

Odpovědět
11.4.2013 14:01
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Kit
Lukáš Hruda:11.4.2013 14:17

Na pořadí provádění příkazů záleží přeci vždycky, program přece nemůže skončit dřív než začal, nemůžeš zapisovat do souboru dřív než ho otevřeš, nemůžeš pracovat s daty ze vstupu dřív než je načteš... Nebo jsi to myslel jinak?

 
Odpovědět
11.4.2013 14:17
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Homo
Kit:11.4.2013 14:21

To vypadá zajímavě. Rekurze je zde úplně skryta.

Odpovědět
11.4.2013 14:21
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Lukáš Hruda
Kit:11.4.2013 14:31

V objektovém jazyku nezáleží na pořadí deklarace tříd, metod ani proměnných. Podstatné je zapouzdření, co je čeho součástí. Na pořadí záleží obvykle až ve chvíli, kdy do bloku napíšu víc příkazů za sebe. Nemusí to však platit vždy, ty příkazy často bývají na sobě nezávislé.

Zpravidla je přece jedno, v jakém pořadí například volám settery jednoho objektu.

Odpovědět
11.4.2013 14:31
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 85.