Laden...

Warum verlangt Rekursion Übergabe der Parameter mit ref?

Erstellt von Lavy vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.192 Views
L
Lavy Themenstarter:in
2 Beiträge seit 2019
vor 4 Jahren
Warum verlangt Rekursion Übergabe der Parameter mit ref?

Guten Tag allerseits,

ich habe vor ein paar Jahren schon einmal C# gelernt, habe mit der Zeit jedoch bemerkt, dass ich ziemlich eingerostet bin und versuch mir das jetzt auf Neue beizubringen. Aktuell scheitere ich leider an einer simplen Rekursion (Fakultäten).
Ich habe eine Consolen Anwendung, welche zunächst nach einer Zahl fragt, dann ob diese zahl hoch 2, hoch 3 oder die Fakultät genommen werden soll. Die Fakultät wollte ich mit Hilfe einer Rekursion lösen. Nun habe ich das Problem, dass, wenn ich die Funktion erneut aufrufe, mir gesagt wird, ich muss die Verringerung der Zahl mit ref übergeben, welches allerdings in keiner der von mir probierten Arten funktionieren möchte.
Bitte entschuldigt die Art des Codes, er ist wirklich nur zum Üben da ^^'


namespace ConsoleApp2
{
    class Program
    {
        static void Sqr(ref int x)
        {
            x = x * x;
        }
        static void Cube(ref int x)
        {
            x = x * x * x;
        }
        static int Fac( ref int x)
        {
            if (x == 1)
                return 1;
            return x * Fac ( x - 1); //hier ist der Fehler
        }
        static void Main(string[] args)
        {
            bool num = true;
            while (num == true)
            {
                Console.Write("Insert Number: ");
                int x = Convert.ToInt32(Console.ReadLine());

                Console.Write("Choose: Sqr (1), Cube (2) or Fac(3): ");
                int choose = Convert.ToInt32(Console.ReadLine());

                if (choose == 1)
                {
                    
                    Sqr(ref x);

                    Console.WriteLine("Output: " + x);
                    Console.WriteLine(" ");
                }

                if (choose == 2)
                {
                   
                    Cube(ref x);

                    Console.WriteLine("Output: " + x);
                    Console.WriteLine(" ");

                }

                if (choose == 3)
                {
                    Fac(ref x);
                    Console.WriteLine("Output: " + x);
                    Console.WriteLine(" ");
                }

                
            }
        }
    }
}

Vielen Dank im Vorraus 😃

Lavy

U
69 Beiträge seit 2019
vor 4 Jahren

Hi,

du musst das x mit dem ref Keyword übergeben:

return x * Fac(ref x-1);

Dann bekommst du die Meldung: A ref or out value must be an assignable variable
Also könnte es so gehen:

var newX = x - 1;
return x * Fac(ref newX);

Ich glaube aber die Berechnung ist falsch. Ich würde für die Rekursion kein ref verwenden.

                if (choose == 3)
                {
                    var fac = Fac(x);
                    Console.WriteLine("Output: " + fac);
                    Console.WriteLine(" ");
                }

und

        static int Fac(int x)
        {
            if (x == 1)
                return 1;

            var newX = x - 1;
            return x * Fac(newX); //hier ist der Fehler
        }

Btw.: Code-Tags in deiner Frage würden das ganze lesbarer machen...

“Knowledge cannot replace friendship. I'd rather be an idiot than lose you.”

  • Patrick to Spongebob
1.696 Beiträge seit 2006
vor 4 Jahren
  1. warum unbedigt mit ref Parameter? Ohne funktioniert ja auch!
  2. wenn mit ref dann muss du Hilfsvariable nehmen, etwa int temp = zahl -1 und ref temp übergeben

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

P
64 Beiträge seit 2011
vor 4 Jahren

Hallo,

bitte die Code tags benutzen. Das macht die Sache deutlich lesbarer.

Zu deiner Frage. Schmeiß das ref aus der Methode raus. Das hat dort nix zu suchen. Du willst ja eine Kopie der Zahl übergeben und keine Referenz drauf.



int fac(int x){
   return x<2 ? 1: x * fac(x-1)
}


4.927 Beiträge seit 2008
vor 4 Jahren

Warum meinst du denn überhaupt ref (in der Methodensignatur) nutzen zu müssen?
Auch deine beiden anderen Methoden sollten ref nicht nutzen, sondern so wie bei deiner Fakultätsmethode das Ergebnis per return zurückliefern.

PS: Bitte editiere deinen Beitrag und füge Code-Tags hinzu.

T
2.219 Beiträge seit 2008
vor 4 Jahren

Bei dem Code oben würde ich auf ref verzichten und das Ergebnis auch entsprechend zurück geben lassen von der Methode.
Gerade Beispiele wie die Fakultät lassen sich auch durch Iteration anstelle von Rekursion lösen.
Ist dann nur eine for Schleife, die sich eben das Ergebnis zwischen merkt und berechnet.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

L
Lavy Themenstarter:in
2 Beiträge seit 2019
vor 4 Jahren

Hallöchen 😃

vielen Dank für die schnelle Antwort.
Hat so endlich geklappt, danke dafür 😄

Das mit den Codetags hab ich keine Ahnung wie man das macht, war mein erster Beitrag hier ^^'
Bitte entschuldigt.

16.792 Beiträge seit 2008
vor 4 Jahren

Das mit den Codetags hab ich keine Ahnung wie man das macht, war mein erster Beitrag hier ^^'

Das steht in [Hinweis] Wie poste ich richtig?.
Der Link wurde Dir bei der Registrierung angezeigt, ebenso musstest Du dieses Thema als "gelesen markieren", bevor Du das erste Thema eröffnest. Wäre nett, wenn man das auch liest, wenn man schon Hilfe erwartet 😃
Soviel dazu 😃