Vorzeitige Beendung von Schleifen - Rekursion?!

Hi!

Auf der Suche nach einer Möglichkeit eine for-each-Schleife abzubrechen, nachdem eine korrekte Zahl gefunden wurde, bin ich nun auf Rekursion gestoßen.

Eingangs ist es ja so, dass die Schleife nach dem finden und ausführen der inneren if-Anweisung mit allen übrigen Elementen verfährt/vergleicht. Durch die Rekursion soll sich die Schleife erneut aufrufen. Diese vergleicht dann zwar wieder alle Elemente, aber macht nach dem finden nicht weiter. So dachte ich es mir jedenfalls. Mir ist klar, dass Rekursionen Risiken birken und dies mit bedacht eingesetzt werden sollten. Ist mein Gedankengang so richtig?

Vielleicht habt ihr ja noch Alternativen. Würde mich freuen :slight_smile:

void searchNumber() {

byte var;
int numbers[] = {1, 2, 3, 4, 5};

  for (int number : numbers) {
    if (number == var) {
      Serial.println("Zahl gefunden: " + String(number));
      searchNumber();
    }
  }
}

Gruß

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

War keine Absicht. Danke!

Da passen mindestens zwei Dinge nicht:

  • Vereinbarung der Variablen in der Funktion statt als Parameter
  • kein Ende der Rekursion auch im "gefunden"-Fall

Grundsätzlich ist Rekursion auf den kleinen CPUs, mit denen wir hier arbeiten, kritisch.

Warum so umständlich? Schau Dir mal break an oder packe die Schleife in eine unktion und springe mit return true zurück bzw. return false am Ende, wenn die Zahl nicht gefunden wurde.

Gruß Tommy

@makkustm

ich sehe da keinen Grund für eine Rekursion.
Nicht mal ein break.
Brich einfach aus der Funktion aus.

z.B. mit einem Rückgabewert auf den Index wenn gefunden:

int searchNumber(int needle) {
  int numbers[] = {1, 2, 3, 4, 5};
  size_t i = 0;
  for (int &number : numbers) {
    if (number == needle) {
      return i;
    }
    i++;
  }
  return - 1;
}

void setup() {
  Serial.begin(115200);
  Serial.println(searchNumber(1));
  Serial.println(searchNumber(4));
  Serial.println(searchNumber(42)); // nicht gefunden
}

void loop() {
  // put your main code here, to run repeatedly:

}
0
3
-1

Aus meiner Wühlkiste, nur dein Array eingebaut:

#include <Streaming.h> // die Lib findest du selber ;-)
Print &cout = Serial; // cout Emulation für "Arme"


int numbers[]     {1, 2, 3, 4, 5};
char buchstaben[] {'c','n','5','t','h'};


struct Result
{
  bool found;
  unsigned cell; 
};

template<typename T, size_t N> Result findInArray(T (&haystack)[N], T needle) 
{
  for (unsigned i=0; i<N;i++) if (haystack[i] == needle) return{true,i};
  return{false,0};
}


void setup() 
{
  Serial.begin(9600);
  cout << F("Start: ") << F(__FILE__) << endl;

  Result res;
  
  res = findInArray(numbers,33);
  if(res.found) cout << "Zellenindex: " << res.cell << endl;
    else cout << "nix mit 33 " << endl;
  
  res = findInArray(numbers,2);
  if(res.found) cout << "Zellenindex: " << res.cell << endl;
    else cout << "nix mit 2 " << endl;
  
  res = findInArray(numbers,3);
  if(res.found) cout << "Zellenindex: " << res.cell << endl;
    else cout << "nix mit 3 " << endl;
    
  res = findInArray(buchstaben,'c');
  if(res.found) cout << "Zellenindex: " << res.cell << endl;
    else cout << "nix mit c " << endl;
  
}

void loop() 
{

}
1 Like

Schön, besonders die struct-Rückgabe und auch das Template.

Gruß Tommy

1 Like

Meinen Dank an euch!
Für die Blumen...

Zu "Vorzeitige Beendigung von Schleifen - Rekursion?!"
wäre mein Senf:
Ganz im Gegenteil.
Dein Vorschlag führt dazu, dass statt eines Schleifenabbruchs das Ganze rekursiv von vorne gestartet wird und so direkt zu einem undefinierten Verhalten (im Volksmund "Crash/Absturz") führt. Wie oft da die jeweilige Erfolgs-Ausgabe noch wiederholt wird, ist auch undefiniert.

Zum vorzeitigen Ende einer Schleife wurde break; erfunden. Oft kann man in Funktionen auch direkt ein return verwenden.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.