C# :: Aufgabe #310 :: Lösung #2
2 Lösungen
#310
Ein nicht-rekursiver Algorithmus!
Anfänger - C#
von Labi1995
- 19.04.2020 um 20:52 Uhr
Was leistet folgender rekursiver Algorithmus für natürliche Zahlen n mit n>0?
Geben Sie einen nicht-rekursiven Algorithmus an, der dasselbe leistet.
int DoSomething(int n)
{
if (n == 1)
return n - 1;
else
{
if ((n / 2) * 2 == n)
{
return 1 + DoSomething(n - 1);
}
else
{
return DoSomething(n - 1);
}
}
}Geben Sie einen nicht-rekursiven Algorithmus an, der dasselbe leistet.
#2
von daniel59 (4260 Punkte)
- 27.04.2020 um 11:10 Uhr
using System;
namespace ConsoleNichtRekursiv
{
class Program
{
static void Main(string[] args)
{
for (int i = 1; i <= 10000; i++)
{
int recursive = DoSomethingRecurvive(i);
int loop = DoSomethingLoop(i);
int simple = DoSomethingSimple(i);
if (!(recursive == loop && loop == simple))
{
Console.WriteLine(i);
}
}
Console.ReadLine();
}
static int DoSomethingRecurvive(int n) // Führt zu StackOverflowException und funktioniert nur bei n >= 1
{
if (n == 1)
{ return n - 1; }
else
{
if ((n / 2) * 2 == n) //Endergebnis um 1 erhöhen, wenn n gerade ist bzw. durch 2 ohne Rest teilbar ist
{
return 1 + DoSomethingRecurvive(n - 1); //n um 1 verringern
}
else
{
return DoSomethingRecurvive(n - 1); //n um 1 verringern
}
}
}
static int DoSomethingLoop(int n) // Führt nicht zu StackOverflowException und funktioniert nur bei n >= 1
{
int tmp = n;
int result = 0;
while (tmp != 1)
{
if ((tmp / 2) * 2 == tmp) //Endergebnis um 1 erhöhen, wenn n gerade ist bzw. durch 2 ohne Rest teilbar ist
{
result++;
}
tmp--; //n um 1 verringern
}
return result;
}
static int DoSomethingSimple(int n) // Führt nicht zu StackOverflowException und funktioniert bei allen möglichen n-Werten und ist effektiver
{
return n / 2;
}
}
}
Kommentare:
Für diese Lösung gibt es noch keinen Kommentar
Seite 1 von 0
1
