rekurencja w wielu wywołaniach c++

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.

#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);
}
0

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

A gdzie jest return w tej funkcji?

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?

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.

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

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ę.

0

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1