Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

16.11.2016, 23:37

Rekursive Funktionen und Endrekursion

Moin!
Gibt es nicht divergierende, rekursive Funktionen, die man nicht endrekursiv darstellen kann?
Wie könnte man entsprechend beweisen? Für den einen Fall ist klar, so eine Funktion finden (die will erst mal gefunden sein), der andere wird schwerer...

MfG
Check

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

2

16.11.2016, 23:59

Könntest du bitte die verwendeten Begriffe definieren oder die Definition verlinken?

3

17.11.2016, 01:00

Ich nenne eine rekursive Funktion, die nicht für alle Eingaben terminiert, divergierend. Meistens nenne ich dazu noch den entsprechenden Wertebereich, für den die Funktion divergiert, aber ich glaub das wird zur Beantwortung meiner Frage weniger relevant sein.

Eine Funktion §f'§ ist endrekursiv, wenn sie sich wie folgt definieren lässt: §f(x)=\left\{\begin{array}{ll}z(x)&\mbox{, falls }B(x)\\f(y(x))&\mbox{, falls }\neg B(x)\end{array}\right.§, wobei §z, y§ beliebige Funktionen sind und §B§ die Funktion beschreibt, die die Abbruchbedingung für §f§ sein soll. Mit anderen Worten sollen §f§ und §f'§ dann in einer idealisierten Umgebung semantisch gleich sein.

Jetzt alles klar? ^^

MfG
Check

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

4

17.11.2016, 08:33

Es existiert eine solche Darstellung: ja. Man kann diese Darstellung praktisch angeben: nein. Leuchtet das ein, sonst werde ich es erlaeutern wenn ich Zeit habe.

5

17.11.2016, 10:35

Also es existiert eine nicht divergierende, rekursive Funktion, die nicht endrekursiv beschreibbar ist?
Wäre echt cool, wenn du das erläutern könntest. :)

MfG
Check

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

17.11.2016, 10:57

Wie genau würde eine "nicht terminierende Funktion" in deiner obigen Darstellung aussehen? Ich hab stark das Gefühl, dass der von dir gewählte Formalismus zur Erfassung des Problems nicht wirklich geeignet ist...

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (17.11.2016, 11:11)


David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

7

17.11.2016, 11:04

Ist das nicht jede Funktion, die sich selbst mehrfach rekursiv aufrufen muss? Z.B. eine rekursive Suche in einem Baum:

Quellcode

1
2
3
4
5
6
7
8
// Liefert WAHR, wenn Eintrag im Baum enthalten ist, sonst FALSCH
Suche_in_Baum(Wurzel, Eintrag) {
    if Wurzel.Wert == Eintrag { return WAHR }
    for Kindknoten in Wurzel.Kindknoten {
        if Suche_in_Baum(Kindknoten, Eintrag) { return WAHR }
    }
    return FALSCH
}

Diese Funktion ist offensichtlich rekursiv und terminiert für jeden gültigen Baum (endlich, keine Zyklen). Aber versuch sie mal endrekursiv darzustellen. Dürfte nicht gehen.

8

17.11.2016, 11:18

die Fibonacci-Folge in nicht geschlossener Form, als xi+1 = xi+x(i-1) ist nicht nicht endrekursiv und divergiert offensichtlich für jede Startwerte, mit absurder Abbruchbegründung, dass x negativ wird. Realistische verfahren sind Mehrschrittverfahren beim Lösen von DGLs die auch divergieren können.. Das gilt natürlich nur, falls ich die Def. von Endrekursiv richtig verstanden habe :P

9

17.11.2016, 11:47

Wie genau würde eine "nicht terminierende Funktion" in deiner obigen Darstellung aussehen?

§g(x)=g(x)§

@David: Wenn ich Zwiswchenzustände in die Knoten schreibe, kann ich die sicherlich auch endrekursiv darstellen...

@GreenPepper: Die Fibonacci-Folge ist endrekursiv darstellbar:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
int fob(int depth, int n, int m)
{
  if(depth <= 0)
    return n;
  fob(depth-1, n+m, n);
}

int fib(int n)
{
  fob(n, 1, 0);
}


Wenn du natürlich die Fibonacci-Folge an sich erzeugen willst, dann divergiert die nach meiner Definition, damit interessiert sie mich auch nicht, da mich nur nicht divergierende Funktionen hierbei interessieren!

Vielleicht nochmal in anderen Worten: Ich bezeichne etwas als endrekursiv, wenn es nach einem rekursiven Aufruf keine weiteren Vorgänge gibt. Also int a(int b){return (b>0) ? 1+a(b-1) : 0;} ist zum Beispiel nicht endrekursiv, dafür aber int a(int b, int akk=0){return (b>0) ? a(b, akk+1) : akk;}

MfG
Check

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

17.11.2016, 11:53

Wie genau würde eine "nicht terminierende Funktion" in deiner obigen Darstellung aussehen?

§g(x)=g(x)§

Das ist eine Tautologie!?

Werbeanzeige