problem z returnem

0

Hej, mam pytanie.
Jest taka oto funkcja:

int dfs(int u)
{
    visited[u]=1;

    if(u==2) return 1;

    for(int i=0; i<graf[u].size(); i++)
    {
        int v=graf[u][i];
        
        if(visited[v]==0)
            dfs(2);
    }
} 

Funkcja ta zwraca 0 zamiast oczekiwanej 1. Zauważyłem że jak wyrzuce pętle

int dfs(int u)
{
    visited[u]=1;

    if(u==2) return 1;

            dfs(2);
} 

To zwracana jest dobra wartość.
Czemu tak jest? I co zrobić żeby w I przypadku zwracało jedynke a nie 0?

0

Ta funkcja w rzeczywistości nie dochodzi do return. Wywołujesz ją z argumentem różnym od 2 i nawet jeśli visited zawiera element równy 0 to 1 jest zwracane do tej funkcji, a nie do main (funkcja wywołuje siebie w funkcji i wartość zwracana jest do niej samej). Natomiast jak dochodzi do końca funkcji, która zwracałaby coś mainowi nie ma return, zatem zwracana jest wartość zależna od czynności w funkcji. Jeśli się nie mylę to Eckel wspomina o tym w swojej książce, ale pewien nie jestem.

Edit:
Dobrze prezentuje to przykład:

#include <iostream>

using namespace std;

int visited[10];

int dfs(int u)
 {
  visited[u]=1;
  if(u==2)
   {
    return 1;
   }
  for(int i=0; i<10; i++)
   if(visited[i]==0)
    cout<<"W funkcji dfs: "<<dfs(2)<<'\n';
//  return 123; //Po odkomentowaniu do main zwracane bedzie 123
 }

int main(void)
 {
  for(int i=0;i<10;i++)
   visited[i]=0;
  cout<<"W main: "<<dfs(1)<<'\n';
  return 0;
 }
1

Jeżeli zadeklarowałeś że funkcja zwraca int to musi go zwrócić za każdym razem. U ciebie jakaś wartość jest zwracana wyłacznie przy spełnieniu warunku (u==2). Z resztą kompilator o tym cie uprzedza.

0

okej problem rozwiązany dzięki za pomoc

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