[C#] Stack Overflow / Recursion

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • SaphuA
  • Registratie: September 2005
  • Laatst online: 10-09 22:00
.

[ Voor 99% gewijzigd door SaphuA op 01-02-2022 16:27 ]


Acties:
  • 0 Henk 'm!

  • creator1988
  • Registratie: Januari 2007
  • Laatst online: 20:55
Gebruik iets als
C#:
1
2
3
4
5
6
7
int i = 0;
while(true) {
    // bruteforce is je method; deze retouneert de nieuwe waarde die moet worden getest
    i = bruteforce(i);

    if( i == 0) break;
}


ipv recursief?

Acties:
  • 0 Henk 'm!

  • SaphuA
  • Registratie: September 2005
  • Laatst online: 10-09 22:00
.

[ Voor 177% gewijzigd door SaphuA op 01-02-2022 16:27 ]


Acties:
  • 0 Henk 'm!

  • MLM
  • Registratie: Juli 2004
  • Laatst online: 12-03-2023

MLM

aka Zolo

heel diep recursieve functies komen niet zo vaak voor geloof ik, dus om daar nou specifiek voor te gaan optimaliseren, niet praktisch. je kan natuurlijk ook gewoon zelf tail-recursion "faken":
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//origineel
object recursieve_functie(object arg)
{
  object newarg = foo(arg); //doe iets met arg
  if(newarg != null) //of een andere conditie om recursie te stoppen
  {
    return recursieve_functie(newarg);
  } 
}

//omschrijven
object niet_recursieve_functie(object arg)
{
  //1) maak je argumenten locals
  object local_arg = arg;
  do
  {
    //2) overschrijf je locals elke iteratie
    localarg = foo(localarg);
  }
  while(localarg != null); //de conditie om recursie te stoppen
  return localarg;
}


daarnaast, waarschijnlijk ondersteunt IL dat niet (waar alle .NET talen naar compileren), dus zou de JITter het moeten gaan doen, maar die willen ze juist zo snel mogelijk houden :)

-niks-


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Je kunt je functie zelf ook gewoon niet-recursief maken en zelf een stack bijhouden van je state.

Bijvoorbeeld in het hypotetische geval van alle files in een directory weergeven (met even een denkbeeldige filesystem API)
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// recursieve variant
void OutputFiles(string path)
{
    foreach(File f in GetFiles(path))
    {
        if (f.IsDirectory())
            OutputFiles(f.GetPath())
        else
            Console.WriteLine(f.GetName());
    }
}

// niet-recursieve variant
void OutputFiles(string path)
{
    Stack<string> paths = new Stack<string>();
    paths.Push(path);

    while(paths.Count > 0)
    {
        path = paths.Pop();
        foreach(File f in GetFiles(path))
        {
            if (f.IsDirectory())
                paths.Push(f.GetPath());
            else
                Console.WriteLine(f.GetName());
        }
    }
}

Wel even opletten. In dit voorbeeld verandert de volgorde waarin de files worden afgelopen. Als volgorde voor jou belangrijk is dan moet je even goed opletten hoe je de code herschrijft.

[ Voor 9% gewijzigd door .oisyn op 03-02-2011 15:04 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.