myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Grundlagen von C# » Warum verlangt Rekursion Übergabe der Parameter mit ref?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Warum verlangt Rekursion Übergabe der Parameter mit ref?

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Lavy
myCSharp.de-Mitglied

Dabei seit: 08.10.2019
Beiträge: 2


Lavy ist offline

Warum verlangt Rekursion Übergabe der Parameter mit ref?

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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 ^^'

C#-Code:
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

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Lavy am 08.10.2019 15:14.

08.10.2019 12:01 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Urza Urza ist männlich
myCSharp.de-Mitglied

Dabei seit: 28.05.2019
Beiträge: 40
Entwicklungsumgebung: VS 2017, VS 2019, ReSharper


Urza ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hi,

du musst das x mit dem ref Keyword übergeben:

C#-Code:
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:

C#-Code:
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.

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

und

C#-Code:
        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...
08.10.2019 12:30 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
vbprogger vbprogger ist männlich
myCSharp.de-Poweruser/ Experte

avatar-1820.gif


Dabei seit: 16.01.2006
Beiträge: 1.693
Entwicklungsumgebung: Visual Studio 2012 Prof.
Herkunft: NRW/DE


vbprogger ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
08.10.2019 12:31 Beiträge des Benutzers | zu Buddylist hinzufügen
panicJonny
myCSharp.de-Mitglied

Dabei seit: 14.11.2011
Beiträge: 61


panicJonny ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.

Code:
1:
2:
3:
int fac(int x){
   return x<2 ? 1: x * fac(x-1)
}
08.10.2019 12:31 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Th69
myCSharp.de-Poweruser/ Experte

avatar-2578.jpg


Dabei seit: 01.04.2008
Beiträge: 3.503
Entwicklungsumgebung: Visual Studio 2015/17


Th69 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
08.10.2019 12:32 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
T-Virus T-Virus ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.04.2008
Beiträge: 1.435
Entwicklungsumgebung: Visual Studio, Codeblocks, Edi
Herkunft: Nordhausen, Nörten-Hardenberg


T-Virus ist offline Füge T-Virus Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
08.10.2019 14:10 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Lavy
myCSharp.de-Mitglied

Dabei seit: 08.10.2019
Beiträge: 2

Themenstarter Thema begonnen von Lavy

Lavy ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallöchen :)

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

Das mit den Codetags hab ich keine Ahnung wie man das macht, war mein erster Beitrag hier ^^'
Bitte entschuldigt.
08.10.2019 15:12 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 13.575
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top



Zitat von Lavy:
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 :-)
08.10.2019 17:45 Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 5 Monate.
Der letzte Beitrag ist älter als 5 Monate.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 01.04.2020 03:01