Wieza hanoi - sumowanie ilosci wykonanych przesuniec

Wieza hanoi - sumowanie ilosci wykonanych przesuniec
Jakub Rachwał
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4
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 :)

Kopiuj
#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');  
}
kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
1

zwracaj liczbę przesunięć z funkcji i tyle.

TomaszLiMoon
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 530
2
Kopiuj
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);
}
Jakub Rachwał
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4
0
TomaszLiMoon napisał(a):
Kopiuj
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

TomaszLiMoon
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 530
3

Nigdzie nie wykorzystujesz wartości zwracanej przez funkcję.

Kopiuj
cout <<  "Liczba wywołań rekurencyjnych = " <<  wiezahanoi(ilosc,'A','B','C') << "\n";
Jakub Rachwał
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4
0
TomaszLiMoon napisał(a):

Nigdzie nie wykorzystujesz wartości zwracanej przez funkcję.

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

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

Jakub Rachwał
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4
0

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

Kopiuj
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";
}}
TomaszLiMoon
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 530
0
Kopiuj
#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";
}
BG
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 293
0

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

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

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.