Rekurencja C++

0

Mam problem z rozwiazaniem zadania. Program ma wykorzystywac rekurencje. Przy podaniu konkretnych danych wynik powinien wynosic 10, zamaist tego uzyskuje 0 badz 1 przy roznych probach naprawy. Bylabym wdzieczna za wskazanie bledu ;)
Dana jest tablica typu tab=array[1..n] of integer. Proszę napisać funkcję, która znajdzie
najmniejsza sume elementów tablicy, dla którego suma elementów jest
równa sumie indeksów tych elementów. Do funkcji należy przekazać tablicę, funkcja powinna
zwrócić sumę elementów znalezionego podzbioru. Na przykład dla tablicy: [ 0,7, 3, 5, 11, 2 ]
rozwiązaniem jest liczba 10.

# include <iostream>
using namespace std;

const int N=6;

int funkcja(int tab[N], int i, int suma, int indeks, int z) //z jest minimalna suma; suma to suma wartosci; indeks-suma indeksow
{
    if(i>=N) return z;
    if(i<N)
    {
        cout<<suma<<"  "<<indeks<<"\n";
        return funkcja(tab,i+1,suma+tab[i],indeks+i,z) || funkcja(tab,i+1,suma,indeks,z);
        if(suma==indeks && z>suma &&suma>0)
        {
            z=suma;
        }
    }
    else return -1;
}

int main()
{
    int tab[N]={0,7,3,5,11,2};
    int a;

    a=funkcja(tab,0,0,0,0);
    cout<<a;

}
0

Po return funkcja już się nie wykonuje.

0

Zrozumialam ze chodzi o zamiane tych dwoch wierszy:

return funkcja(tab,i+1,suma+tab[i],indeks+i,z) || funkcja(tab,i+1,suma,indeks,z);
        if(suma==indeks && z>suma &&suma>0)
        {
            z=suma;
        }

Mimo ich zamiany wynik pozostaje niezmieniony ;(

0

Miejscami, nic nie zmienilam procz kolejnosci, to zle?

        if(suma==indeks && z>suma &&suma>0)
        {
            z=suma;
        }
return funkcja(tab,i+1,suma+tab[i],indeks+i,z) || funkcja(tab,i+1,suma,indeks,z);
0

Co oznacza taki zapis?

return funkcja(tab,i+1,suma+tab[i],indeks+i,z) || funkcja(tab,i+1,suma,indeks,z);
0

Hm.. Tak szczerze mowiac to nie ogarniam za bardzo rekurencji. Staralam sie wzorowac na przykladzie robionym na zajeciech. Wiec to tutaj jest blad? Powinnam usunac return? Jak to mialoby zatem wygladac?

0

Błąd jest w tym że próbujesz pisać program na chybił trafił.
Tą metodą masz mniej szans napisać działający program niż 100 razy z rzędu wygrać w totolotka.
Więc przeczytaj byle jaki kurs aby znać przynajmniej znaczenia operatorów.
Rekurencje wytłumaczę czy w jednym wierszu: Wyobraź sobie że masz nieskończoną ilość takich funkcji o nazwie funkcja ale wyglądających identycznie a przy każdym jej wywołaniu jest wywołana inna - ot cała filozofia.

0

Dzieki bardzo za wyjasnienie, nie jest to natomiast pierwszy program rekurencyjny ktory pisze a reszta dzaiala. Wzielam sie za cos trudniejszego i potrzebuje wskazowki czy to wgl zmierza w dobrym kierunku czy od podstaw jest zle.

0

@Ania24 - a jaką wartość ma zawierać zmienna i żeby Twoja funkcja zwróciła -1? Ostatni else jest zbędny i wystarczy tylko jeden warunek if (i >= N).

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