Skocz do zawartości

  •  
  • Mini kompendium
  • MimeTeX
  • Regulamin

Zdjęcie

[C#] Wieża Hanoi - rekurencja


  • Nie możesz napisać tematu
  • Zaloguj się aby odpowiedzieć
7 odpowiedzi w tym temacie

#1 niusia

niusia

    Kombinator

  • Użytkownik
  • 164 postów
11
Mały Pomocnik I

Napisano 06.06.2009 - 23:05

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
  • 0

Afroman

    Kombinator

  • Użytkownik
3
  • Płeć:Kobieta

Napisano 25.09.2011 - 17:55

#2 MarkII

MarkII

    Operator całkujący

  • VIP
  • 487 postów
22
Mały Pomocnik I
  • Płeć:Mężczyzna

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ę :rolleyes: )
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?
  • 0
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 niusia

niusia

    Kombinator

  • Użytkownik
  • 164 postów
11
Mały Pomocnik I

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);
			}
		}
	}
}

  • 0

#4 MarkII

MarkII

    Operator całkujący

  • VIP
  • 487 postów
22
Mały Pomocnik I
  • Płeć:Mężczyzna

Napisano 07.06.2009 - 16:45

A co dokładnie nie działa?
  • 0
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 niusia

niusia

    Kombinator

  • Użytkownik
  • 164 postów
11
Mały Pomocnik I

Napisano 07.06.2009 - 17:09

program se sypie w sumie tylko dla wyjątków (0 i ujemnych)
  • 0

#6 MarkII

MarkII

    Operator całkujący

  • VIP
  • 487 postów
22
Mały Pomocnik I
  • Płeć:Mężczyzna

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.
  • 0
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 niusia

niusia

    Kombinator

  • Użytkownik
  • 164 postów
11
Mały Pomocnik I

Napisano 07.06.2009 - 17:47

jak go wyłapać
  • 0

#8 MarkII

MarkII

    Operator całkujący

  • VIP
  • 487 postów
22
Mały Pomocnik I
  • Płeć:Mężczyzna

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).
  • 0
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".