Mam problemy z napisaniem w języku C# następującego programu z wykorzystaniem rekurencji:
Mamy trzy pręty i n krążków o różnych średnicach, które są nanizane są na pierwszy pręt w porządku malejących średnic tworząc wieżę. Chcemy przenieść krążki z pierwszego pręta na drugi, przy pomocy pręta trzeciego stosując następujące zasady:
- w każdym kroku można przenieść dokładnie jeden krążek
- krążek nie może być nigdy nałożony na krążek o mniejszej średnicy
[C#] Wieża Hanoi - rekurencja
Rozpoczęty przez niusia, Jun 06 2009 23:05
7 odpowiedzi w tym temacie
#1
Napisano 06.06.2009 - 23:05
Napisano 25.09.2011 - 17:55
#2
Napisano 06.06.2009 - 23:29
Sprawa jest dość prosta. Oznaczmy pręty jako X,Y,Z. Umówmy się, że chcemy przenieść krążki z X na Z. Należy zauważyć kilka rzeczy:
1. Przeniesienie n krążków, to przeniesienie (n-1) krążków na 'wolny pręt' Y, przeniesienie n-tego (największego) krążka na pręt docelowy i przeniesienie (n-1) krążków na pręt docelowy Z. A to z kolei przeniesienie n-2 krążków na 'wolny.... (tutaj mamy rekurencję )
2. Jeśli pozostał nam do przeniesienia ostatni krążek, to przenosimy krążek na docelowy pręt i kończymy.
w kodzie wygląda no mniej tak:
ps. jak poszło z poprzednim zadaniem?
1. Przeniesienie n krążków, to przeniesienie (n-1) krążków na 'wolny pręt' Y, przeniesienie n-tego (największego) krążka na pręt docelowy i przeniesienie (n-1) krążków na pręt docelowy Z. A to z kolei przeniesienie n-2 krążków na 'wolny.... (tutaj mamy rekurencję )
2. Jeśli pozostał nam do przeniesienia ostatni krążek, to przenosimy krążek na docelowy pręt i kończymy.
w kodzie wygląda no mniej tak:
void hanoi(int n, char x, char y, char z) { if (n == 0) { return; } hanoi(n-1,'X','Z','Y'); wypisz('X->Z'); hanoi(n-1,'Y','X','Z'); }
ps. jak poszło z poprzednim zadaniem?
David Hilbert (1862-1943) wybitny niemiecki matematyk zapytany o jednego z byłych uczniów odpowiedział: "Ach, ten, został poetą. Na matematyka miał zbyt mało wyobraźni".
#3
Napisano 07.06.2009 - 16:30
nie wychodzi mi ten program, zrobiłam, tak, ze ostatni pręt jest pomocniczy, a na drugi pręt mam przełożyć
using System; using System.Collections.Generic; using System.Text; namespace WizeHanoi { class Program { static void Main(string[] args) { uint n; Console.Write("Podaj liczbę krążków: "); n = Convert.ToUInt16(Console.ReadLine()); Hanoi(n, 'X', 'Z', 'Y'); Console.ReadKey(); } static void Hanoi(uint n, char x, char y, char z) { if (n == 0) throw new ArgumentException("Liczba krażków musi być większa niż zero"); if (n == 1) { Console.WriteLine("Przenieś z prętu {0} na pręt {1}.", x, y); } else { Hanoi(n - 1, x, z, y); Console.WriteLine("Przenieś z prętu {0} na pręt {1}.", x, y); Hanoi(n - 1, z, y, x); } } } }
#4
Napisano 07.06.2009 - 16:45
A co dokładnie nie działa?
David Hilbert (1862-1943) wybitny niemiecki matematyk zapytany o jednego z byłych uczniów odpowiedział: "Ach, ten, został poetą. Na matematyka miał zbyt mało wyobraźni".
#5
Napisano 07.06.2009 - 17:09
program se sypie w sumie tylko dla wyjątków (0 i ujemnych)
#6
Napisano 07.06.2009 - 17:32
Skoro rzucasz wyjątkiem i nigdzie w przebiegu programu go nie wyłapujesz, to aplikacja musi się posypać. O to w tym chodzi, gdy się rzuca wyjątkiem.
David Hilbert (1862-1943) wybitny niemiecki matematyk zapytany o jednego z byłych uczniów odpowiedział: "Ach, ten, został poetą. Na matematyka miał zbyt mało wyobraźni".
#7
Napisano 07.06.2009 - 17:47
jak go wyłapać
#8
Napisano 07.06.2009 - 18:10
W wypadku tego programu lepiej nie bawić się w wyjątki.
Lepiej nic nie zwracaj (usuń linię z wyjątkiem).
Lepiej nic nie zwracaj (usuń linię z wyjątkiem).
David Hilbert (1862-1943) wybitny niemiecki matematyk zapytany o jednego z byłych uczniów odpowiedział: "Ach, ten, został poetą. Na matematyka miał zbyt mało wyobraźni".