rekurencja w wielu wywołaniach c++

rekurencja w wielu wywołaniach c++
B4
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10
0

Mam problem ze zrozumieniem funkcji subdivide. Nie wiem jak działa tutaj rekurencja. I jeszcze mam pytanie co zwraca samo słowo return w tej funkcji.

Kopiuj
#include<iostream>
#include <cstdlib>

const int Len = 66;
const int Divs = 6;

void subdivide(char ar[], int low, int high, int level);

using namespace std;

int main()
{
    char ruler[Len];
    int i;
    for (i = 1; i < Len - 2; i++)
        ruler[i] = ' ';
    ruler[Len - 1] = '\0';
    int max = Len - 2;
    int min = 0;
    ruler[min] = ruler[max] = '|';
    cout << ruler << endl;
    for (i = 1; i <= Divs; i++)
    {
        subdivide(ruler, min, max, i);
        cout << ruler << endl;
    }

    return 0;
}
void subdivide(char ar[], int low, int high, int level)
{
    if (level == 0)
        return;
    int mid = (high + low) / 2; 
    ar[mid] = '|';
    subdivide(ar, low, mid, level - 1);  
    subdivide(ar, mid, high, level - 1);
}
lion137
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5023
0

. I jeszcze mam pytanie co zwraca samo słowo return w tej funkcji.

A gdzie jest return w tej funkcji?

PapiVPG
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 15
4

Najlepsza metoda na zrozumienie to kartka papieru i rozpisywać sobie co dana funkcja robi. Możesz dla treningu zrobić funkcję używając rekurencji wyliczającą silnię z liczby lub n-ty wyraz ciągu Fibonacciego. Z tego co widzę jest to przykład z ksiązki S.Prata?

stivens
  • Rejestracja: dni
  • Ostatnio: dni
3

Najlepsza metoda na zrozumienie to kartka papieru i rozpisywać sobie co dana funkcja robi.

A moze po prostu odpal debugger? :)

Prostszy, przyjemniejszy i dokladniejszy sposob. A w dodatku obsluga debuggera przyda sie, oj przyda.

T3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 687
0

Funkcja wyglada jak jakis rodzaj sortowania metoda "dziel i zwyciezaj", wiec najlepiej bedzie zobaczyc na przykladach jak merge sort. Tez na polskim yt sa filmy z omowieniem tego krok po kroku (na tablicy), a pozniej omowienie implementacji

nalik
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1039
0
b4rteq napisał(a):

Tak to jest przykład z książki S.Prata. tylko w książce pisze, że jedno wywołanie generuje 2. I tego własnie nie rozumie. Bo myslalem, że c++ subdivide(ar, low, mid, level - 1); najpierw wykonuje sie az do niespelnienia warunku, a potem dopiero funkcja c++ subdivide(ar, mid, high, level - 1); wykonuje sie tyle samo razy tak jak na Listing 7.16

W zasadzie masz rację. Być może nie zrozumiałeś intencji autora, gdy pisał o generowaniu dwóch wywołań. Koncepcyjnie, jedno wywołanie funkcji subdivide spowoduje 2 wywołania subdivide. Nie oznacza to, że oba wywołania następują w tym samym czasie. Podczas czasu wykonania, ponieważ program jest jednowątkowy, subdivide będzie wykonywać się rekurencyjnie aż do niespełnienia warunku. Drugie wywołanie zacznie się wykonywać kiedy pierwsze wywołanie rekurencyjne zakończy się.

lion137
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5023
0

Dodatkowo ta funkcja jest mega wolna; level idzie do zera, czyli tak na oko, złożoność będzie O(2^{level + 1})

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.