Avatar
Ondřej Krsička
Redaktor
Avatar
Ondřej Krsička:

Ahoj, mám tento kód.

class Uzel
{
    public Uzel Předek { get; set; }
    public List<Uzel> Potomci { get; set; }
    public Uzel()
    {
        Předek = null;
        Potomci = new List<Uzel>();
    }
    public int Hloubka(int hloubka)
    {
        if (Předek == null)
        {
            return hloubka;
        }
        else
        {
            return Předek.Hloubka(hloubka + 1);
        }
    }
    public int Hloubka()
    {
        return Hloubka(0);
    }
}

Když zjišťuju hloubky stromu odhadem v řádu tisíců, maximálně však 1 mil., vyhodí to na mě stack overflow. U menších hloubek to však funguje správně.

Napadlo mě, že by metoda byla typu void a upravovala by statickou proměnnou. Fungovalo by to takhle?

 
Odpovědět 16. července 15:32
Avatar
Ondřej Krsička
Redaktor
Avatar
Odpovídá na Ondřej Krsička
Ondřej Krsička:

Ta proměnná by ani nemusela být statická, stačilo by private field. No nic, jdu to nakódit.

 
Nahoru Odpovědět 16. července 15:37
Avatar
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na Ondřej Krsička
patrik.valkovic:

StackOverfow ti může způsobit i samotná rekurze. Máš-li tam houbku 1 mil, nepoužívej rekurzi ale pomož si spíše zásobníkem.

Nahoru Odpovědět 16. července 15:48
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Ondřej Krsička
Martin Dráb:

Pokud víš, že sice budeš hodně využívat zásobník, ale přecejen nějak omezeně, můžeš jeho velikost ovlivnit v nataveních projektu/překla­dače.

Jinak každý kód provádějící rekurzi můžeš přepsat na ekvivalentní kód používající tebou deklarovaný zásobník (co jiného rekurze je než použití zásobníku, ale toho "procesorového"). Stejně jako každá proměnná alokovaná na zásobníku může být alokována dynamicky.

Nahoru Odpovědět 16. července 15:58
2 + 2 = 5 for extremely large values of 2
Avatar
Ondřej Krsička
Redaktor
Avatar
Odpovídá na patrik.valkovic
Ondřej Krsička:

pomož si spíše zásobníkem

Tak teď vůbec nevím, o čem mluvíš.

 
Nahoru Odpovědět 16. července 16:02
Avatar
Ondřej Krsička
Redaktor
Avatar
Odpovídá na Martin Dráb
Ondřej Krsička:

A nevíš, jak to nastavím?

 
Nahoru Odpovědět 16. července 16:03
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Ondřej Krsička
Martin Dráb:

Hm, zdá se, že pro .NET na to bude nejlepší použít utilitku EDITBIN, konkrétně s parametrem /STACK.

Viz reference k utilitce
https://msdn.microsoft.com/…25ddyfc.aspx

Nahoru Odpovědět 16. července 18:29
2 + 2 = 5 for extremely large values of 2
Avatar
Marian Benčat
Redaktor
Avatar
Marian Benčat:

Doporučuji nevymýšlet žádné hlouposti typu simulace zásobníků, ale místo rekurze to implementovat iteračně. Není přeci problém si někde držet referenci na "aktuální node" a celé to narvat do
While(aktualni­.predek!=null) {
pocet++;
aktualni = aktualni.predek;
}

nebo něco podobného..

Editováno 16. července 20:04
Akceptované řešení
+20 Zkušeností
Řešení problému
 
Nahoru Odpovědět 16. července 20:04
Avatar
Ondřej Krsička
Redaktor
Avatar
Odpovídá na Marian Benčat
Ondřej Krsička:

Jasný, proč to dělat složitě, když to jde jednoduše.

 
Nahoru Odpovědět 17. července 10:19
Avatar
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na Marian Benčat
patrik.valkovic:

Obvykle se stromy dělají bez ukazatele na rodiče, v takových situacích je použitá zásobníku jediná možnost.

Nahoru Odpovědět  +1 17. července 11:17
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Marian Benčat
Redaktor
Avatar
Odpovídá na patrik.valkovic
Marian Benčat:

too máte pravdu-. často je vlastní zásobník jediná možnost. zde ne :-)

 
Nahoru Odpovědět 17. července 11:20
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 11 zpráv z 11.