Cum se utilizează o metodă recursivă care are un tip de returnare void în java? (Programare, Java, Recursivitate)

pudge a intrebat.
a intrebat.

Deci, am înțeles cum să folosesc o metodă recursivă care are un alt tip de returnare decât void. De obicei, aș apela din nou aceeași metodă în aceeași metodă( în interiorul cazului recursiv), în timp ce am decrementat sau incrementat o anumită valoare în apel pentru a ajunge la cazul de bază. Apoi, la un moment dat, cazul de bază este atins și problema este rezolvată, astfel încât începe să returneze valoarea din fiecare apel. În această direcție.

DAR
Ce se întâmplă dacă metoda are tipul de returnare void, deci nu puteți apela metoda deoarece nu va returna/nu poate returna nimic? Încerc să scriu o propoziție pe dos, pe care am rezolvat-o atât cu o buclă for loop, cât și cu o metodă resucrive care poate returna o valoare de tip șir de caractere, dar nu sunt sigur cum să o abordez dacă este void, ceea ce este ceea ce cere atribuirea.
Edit: Ar mai trebui să menționez că propoziția poate fi trecută doar în parametru

Mulțumesc tuturor pentru informații și ajutor!

Comentarii

  • Folosiți un obiect la nivel de clasă pentru a păstra datele de recursivitate. O practică proastă totuși, deoarece va fi greu de urmărit problemele cu recursivitatea / va fi greu de implementat de fapt recursivitatea, deoarece obiectul dvs. este în mutație tot timpul. Folosiți-o în principal doar pentru cazuri simple, cum ar fi sumele/concentrarea. –  > Por Norbert van Nobelen.
3 răspunsuri
CesarPim

Recursiunea nu funcționează doar cu metode/funcții care returnează valori. Recursiunea înseamnă doar că metoda/funcția se apelează pe sine.

Trebuie să garantezi că există cel puțin o condiție de oprire, dar asta nu presupune ca funcția să returneze o valoare. Acest lucru se realizează în mod obișnuit prin modificarea incrementală a unuia sau mai multor argumente pe care le treceți de fiecare dată când funcția se apelează singură în mod recursiv. Atunci când acel/acele argumente îndeplinesc o anumită condiție, funcția dvs. nu se mai apelează singură și toate operațiile în așteptare sunt rezolvate.

Nu sunt pe deplin conștient de sarcina pe care încercați să o realizați, dar iată un exemplu de funcție recursivă care scrie un șir de caractere în sens invers. Folosesc PSEUDO-funcții cu nume care sperăm că sunt auto-explicative.

public void writeBackwards(String str) {
    // This is the negation of the stop condition, so the stop condition
    // is when the string is empty, in which case this function will do
    // nothing:
    if (!str.isEmpty()) {
        char firstCharacter = str.getFirstCharacter();
        str = str.removeFirstCharacter();
        writeBackwards(str); // the recursive call
        // The following operation will be pending, waiting for the
        // recursive call to be resolved first:
        writeCharacter(firstCharacter);
    }
}

Comentarii

  • Vă mulțumesc. Cred că am fost atât de concentrat pe faptul că trebuie să returneze ceva de fapt. Am sfârșit prin a folosi o variabilă ca spațiu pentru un caracter. Acesta ar imprima acel caracter de la ultima poziție până la început, până când se ajungea la cazul de bază al poziției 0 a caracterului. Astfel, variabila ar fi ultimul caracter, ar imprima variabila respectivă, apoi ar apela din nou funcția minus 1 poziție. M-am uitat la exemplele anterioare care par complicate, dar acesta a fost foarte simplu. –  > Por pudge.
radoh

Puteți folosi orice Obiect mutabil ca parametru al funcției recursive pentru a stoca rezultatul. De exemplu, problema cu propoziția inversă pe care ați menționat-o ar putea fi scrisă astfel::

public void stringReverse(String s, int index, StringBuilder sb) {
    if (index < 0)
        return;
    sb.append(s.charAt(index));
    stringReverse(s, index - 1, sb);
}

Și apelată astfel

StringBuilder sb = new StringBuilder();
stringReverse(mySentence, mySentence.length() - 1, sb);

SSDong

La fel cum în C++ puteți trece în pointeri, aici, în Java, puteți pur și simplu să treceți un obiect de clasă în funcție pentru a păstra valoarea generată de apelurile recursive ale funcției. Un exemplu simplu care reflectă întrebarea dvs. de a calcula numărul fibonacci este următorul.

public class ComputeFibonacci {
  static class Fibonacci {
    public int ith;
    public int value;
    Fibonacci(int a, int b) {
      ith = a;
      value = b;
    }
  }

  private static void fibonacci(Fibonacci result) {
    if (result.ith == 1 || result.ith == 2) {
      result.value = 1;
    } else {
      Fibonacci left = new Fibonacci(result.ith - 1, 0);
      Fibonacci right = new Fibonacci(result.ith - 2, 0);
      fibonacci(left);
      fibonacci(right);
      result.value = left.value + right.value;
    }
  }

  public static void main(String[] args) {
    // Here we compute the 10th fibonacci number
    Fibonacci f = new Fibonacci(10, 0);
    fibonacci(f);
    System.out.println("The result is " + f.value);
  }
}

Mult succes.