Wieza hanoi - sumowanie ilosci wykonanych przesuniec

0

Witam, napisalem ten kodzik, ale w zadaniu mam jeszcze napisane, iz musze obliczyc ilosc wykonanych przesuniec, a niestety nie mam pojecia jak to zrobic. Prosze o pomoc :)

#include<iostream>
using namespace std;

void wiezahanoi(int num,char A,char B,char C){
  if(num>0){
    wiezahanoi(num-1, A, C, B);
    cout<<"Przesun dysk "<<num<<" z"<<" "<<A<<" do"<<" "<<C<<endl;
    wiezahanoi( num-1, B, A, C);
  }
}

int main(){
  int ilosc;
  cout<<"Wprowadz liczbe dyskow: "<<endl;
  cin>>ilosc;
  wiezahanoi(ilosc,'A','B','C');  
}
1

zwracaj liczbę przesunięć z funkcji i tyle.

2
int wiezahanoi( int num , char A , char B , char C )
{
  if( num <= 0 ) return 0;
  cout << "Przesun dysk " << num << " z " << A << " do " << C << endl;
  return 1 + wiezahanoi(num-1,A,C,B) + wiezahanoi(num-1,B,A,C);
}
0
TomaszLiMoon napisał(a):
int wiezahanoi( int num , char A , char B , char C )
{
  if( num <= 0 ) return 0;
  cout << "Przesun dysk " << num << " z " << A << " do " << C << endl;
  return 1 + wiezahanoi(num-1,A,C,B) + wiezahanoi(num-1,B,A,C);
}

Niestety nie dziala, chyba, ze o czyms zapomnialem, dopiero zaczynamy rekurencyjne i nie za bardzo je ogarniam

screenshot-20200331123827.png

3

Nigdzie nie wykorzystujesz wartości zwracanej przez funkcję.

cout <<  "Liczba wywołań rekurencyjnych = " <<  wiezahanoi(ilosc,'A','B','C') << "\n";
0
TomaszLiMoon napisał(a):

Nigdzie nie wykorzystujesz wartości zwracanej przez funkcję.

cout <<  "Liczba wywołań rekurencyjnych = " <<  wiezahanoi(ilosc,'A','B','C') << "\n";

Super, wszystko teraz dziala, jak nalezy. Bardzo dziekuje za pomoc :)

0

Niestety jednak nie dziala to w 100%, zle liczy, zaczyna od 3 bloczka, gdzie jest mozliwosc tylko od 1 w przypadku 3.

using namespace std;

int wiezahanoi( int num , char A , char B , char C )
{
  if( num <= 0 ) return 0;
  cout << "Przesun dysk " << num << " z " << A << " do " << C << endl;
  return 1 + wiezahanoi(num-1,A,C,B) + wiezahanoi(num-1,B,A,C);
}

int main(){
  int ilosc;
  cout<<"Wprowadz liczbe dyskow: "<<endl;
  cin>>ilosc;
  cout <<  "Liczba wywolan rekurencyjnych = " << wiezahanoi(ilosc,'A','B','C') << "\n";
}}
0
#include <iostream>
#include <array>

using namespace std;

int wiezahanoi( int num , char A , char B , char C )
{
  if( num <= 0 ) return 0;
  auto calls {1};
  calls += wiezahanoi(num-1,A,C,B);
  cout << "Przesun dysk " << num << " z " << A << " do " << C << endl;
  calls += wiezahanoi(num-1,B,A,C);
  return calls;
}

int main()
{
  int ilosc;
  cout<<"Wprowadz liczbe dyskow: "<<endl;
  cin>>ilosc;
  auto calls = wiezahanoi(ilosc,'A','B','C');
  cout <<  "Liczba wywolan rekurencyjnych = " << calls << "\n";
}
0

A musisz to zwracać czy wystarczy obliczyć ile tego będzie ?

int calls = (2 << (ilosc - 1)) - 1;   // pow(2, ilosc) - 1,   dla ilosc > 0

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