Rückwärts Ausgabe mit Rekursion



  • Hallo

    Rekursion ist doch der wiederholter Aufruf einer Funktion in der eigenen Funktion
    oder in einer anderen Funktion. Oder nicht?
    Diese kann sowohl Vorwärts als Rückwärts geschehen. Iteration ist auch Rekursion einer Funktion?

    Irgendwie bringe ich da wohl was durcheinander. In den bisher in reinem c++ geschriebenen Code sieht das einleuchtend aus, aber wie sieht die Geschichte in c++/cli aus? Mein Problem ist folgendes Programm:

    #include "stdafx.h"
    
    using namespace System;
    
    ref class listenelement
    {
    	String ^daten;
    	listenelement ^next;
    	listenelement ^ende;
    
    public:
    
    	Void setDaten(String ^datenneu);
    	Void anhaengen(String ^datenneu);
    	Void ausgeben(listenelement ^listenanfang);
    	/*Void ausgaberueck(listenelement ^listenede);*/
    };
    
    Void listenelement::setDaten(String ^datenneu)
    {
    	daten = datenneu;
    }
    
    Void listenelement::anhaengen(String ^datenneu)
    {
    	if (next == nullptr)
    	{
    		next = gcnew listenelement;
    		next -> daten = datenneu;
    
    		ende = next;
    	}
    	else
    	{
    		ende -> anhaengen(datenneu);
    	}
    
    	Console::WriteLine("Daten {0} wurden eingfügt.\n",datenneu);
    }
    
    Void listenelement::ausgeben(listenelement ^listenanfang)
    {
    	Console::WriteLine("{0}",daten);
    
    	if (next != nullptr)
    
    		next -> ausgeben(listenanfang);
    
    	ende = next;
    		if (ende != nullptr)
    			ende -> ausgeben(listenanfang);
    }
    
    //Void listenelement::ausgaberueck(listenelement ^listenende)
    //{
    //	Console::WriteLine("{0}",daten);
    //
    //	if(ende != nullptr)
    //	{
    //		ende -> ausgaberueck(listenende);
    //	}
    //}
    
    int main(array<System::String ^> ^args)
    {
    	listenelement ^listenanfang;
    	listenelement ^listenende;
    
    	listenanfang = gcnew listenelement;
    
    	listenanfang -> setDaten("Element: 1");
    	listenende = listenanfang;
    
    	for (Int32 schleife = 2; schleife < 4; schleife++)
    
    		listenanfang -> anhaengen("Element: " + schleife);
    
    	listenanfang -> ausgeben(listenanfang);
    
    	/*for (Int32 schleife = 2; schleife < 4; schleife--)
    
    		listenende -> anhaengen("Element: " - schleife);*/
    
    	/*listenende -> ausgaberueck(listenende);*/
    
    	Console::Read();
        return 0;
    }
    

    Die Ausgabe soll 1, 2, 3 Vorwärts und dann in folge einer Rekursion rückwärts ausgegeben werden. Also 3, 2, 1,

    Meine Ausgabe sieht so aus:

    Daten Element: 2 wurden eingfügt.

    Daten Element: 3 wurden eingfügt.

    Daten Element: 3 wurden eingfügt.

    Element: 1
    Element: 2
    Element: 3
    Element: 3
    Element: 2
    Element: 3 // Hier sollte eine 1 stehen
    Element: 3 // Diese drei sollte erst gar nicht erscheinen

    Was habe ich nicht verstanden? Der Anfang der rückwärts Ausgabe ist ja da, aber warum kommt anstatt der 1 zweimal eine 3?

    Lieben Dank für Eure Hilfe
    champman



  • Ich weiß nicht, was du da machst. Mir wird schon allein vom Anschauen schlecht, also kann ich dir da unmöglich helfen.
    Iteration ist keine Rekursion einer Funktion, so viel kann ich dir schon mal verraten.



  • Hallo

    Programm funktioniert jetzt. 😃

    #include "stdafx.h"
    
    using namespace System;
    
    ref class listenelement
    {
    	String ^daten;
    	listenelement ^next;
    	listenelement ^ende;
    
    public:
    
    	Void setDaten(String ^datenneu);
    	Void anhaengen(String ^datenneu);
    	Void ausgeben();
    	Void ausgaberueck();
    };
    
    Void listenelement::setDaten(String ^datenneu)
    {
    	daten = datenneu;
    }
    
    Void listenelement::anhaengen(String ^datenneu)
    {
    
    	if (next == nullptr)
    	{
    		next = gcnew listenelement;
    		next -> daten = datenneu;
    
    		ende = next;
    	}
    	else
    	{
    		ende -> anhaengen(datenneu);
    	}
    
    	Console::WriteLine("Daten {0} wurden eingfügt.\n",datenneu);
    }
    
    Void listenelement::ausgeben()
    {
    	Console::WriteLine("{0}",daten);
    
    	if (next != nullptr)
    
    		next -> ausgeben();
    }
    
    Void listenelement::ausgaberueck()
    {
    	Console::WriteLine();
    
    	if(ende != nullptr)
    
    		ende -> ausgaberueck();
    
    	Console::WriteLine("{0}",daten);
    }
    
    int main(array<System::String ^> ^args)
    {
    	listenelement ^listenanfang;
    	listenelement ^listenende;
    
    	listenanfang = gcnew listenelement;
    
    	listenanfang -> setDaten("Element: 1");
    	listenende = listenanfang;
    
    	for (Int32 schleife = 2; schleife < 4; schleife++)
    
    		listenanfang -> anhaengen("Element: " + schleife);
    
    	listenanfang -> ausgeben();
    
    	listenende -> ausgaberueck();
    
    	Console::Read();
        return 0;
    }
    

    Gruß

    champman


Anmelden zum Antworten