Loading...
nrayanov avatar nrayanov 39 Точки

[Homework] Algorithms - Tower of Hanoi

Здравейте, колеги,

От 2 часа мъча Tower of Hanoi (зад. 1 от домашното) с рекурсия и нещо не мога да се справя.

Стигам до стъпка 5 и не мога да тествам успешно.

Кодът, който съм написал досега може да откриете тук - http://pastebin.com/GnUfNuSV (EDIT: Тук вече може да намерете оправеният код)

Грешката, която ми дава е System.FormatException за ред 55. 

Всяка помощ е добре дошла.

Поздрави,

Николай Раянов

Тагове:
0
Open Courses 22/09/2015 23:20:57
nrayanov:
Проблемът е решен
enevlogiev avatar enevlogiev 1168 Точки

Веднага виждам, че на този и на следващия ред си объркал скобите. Имаш ) вместо }. Надявам се това да е бил проблемът, защото ме мързи да тествам : )

Пиши, ако е нещо друго ..

1
nrayanov avatar nrayanov 39 Точки

Здравей,

 

Благодаря, че си погледнал, но май не е в това проблема. Програмата се компилира.

 

EDIT: Беше в скобите, но ми отне доста време да го видя ;)

 

Поздрави,

Николай Раянов

0
22/09/2015 23:06:31
aanguelov avatar aanguelov 219 Точки

Хах, сега погледнах новото условие, че я бях написал преди 3 дена по старото...

Това -> Console.WriteLine($"Step #{steps}: Moved disk {bottomDisk}"); е меко казано странно, пък ти си взел че си го преписал дословно. Правилното по-скоро би изглеждало така -> Console.WriteLine("Step #{0}: Moved disk {1}", steps, bottomDisk);

Освен това и рекурсията ти е грешна. В рекурсивно извикваните методи трябва да подаваш bottomDisk - 1 и стековете, които ти приема оригиналния метод, а не статичните декларирани най горе.

3
nrayanov avatar nrayanov 39 Точки

Здравей aanguelov,

Благодаря ти за отговора. Всъщност първо го бях написал с - 1, после пробвах и без. Грешката си е все същата.

Поздрави,

Николай Раянов

0
ttitto avatar ttitto 1153 Точки

Виждам две неща, но в момента не мога да тествам дали това ще ти реши проблема:

1, когато извикваш рекурсивно moveDisks не подаваш броя дискове намален с едно, а го подаваш с текущия брой Така на практика (вероятно) никога не стигаш го момент, при който броя дискове == 1

2. при правия ход на рекурсията мисля, че метода (както си го дефинирал ти) трябва да се извиква с колчетата в следната последователност: source, spare, destination, а при обратния ход: spare, destination, source

1
nrayanov avatar nrayanov 39 Точки

Здравей, ttitto,

Благодаря ти, че си погледнал кода. Наистина в момента кода е без - 1, но пробвах и със, грешката е същата.

Що се отнася до последователност - изпробвах абсолютно всички комбинации от поредности, при всичките резултата е един и същ.

Поздрави,

Николай Раянов

0
Isibel avatar Isibel 41 Точки

Проблема ти идва от това, че рекурсивно извикваш методите със статичните имена, а не както на 3-ти ред е с името, което си декларирал в метода. 

  1.   MoveDisks(bottomDisk - 1, source, destination, spare);

  2.             steps++;

  3.             destinationRod.Push(sourceRod.Pop());

  4.             Console.WriteLine($"Step #{steps}: Moved disk {bottomDisk}");

  5.             PrintRods();

  6.             MoveDisks(bottomDisk - 1, spare, source, destination);

2
22/09/2015 21:29:53
Filkolev avatar Filkolev 4482 Точки

Колеги, стековете са статични, защото добавихме изход на всяка стъпка - да се принтира съдържанието на трите първоначални стека. Рекурсивното викане на MoveDisks обърква нещата и няма как на всяка една стъпка да се знае кой е оригиналният source, кой е destination и кой spare. Това създава известни проблеми с имената на применливите, в условието също е отбелязано, но може на някои да е убягнало. Параметрите на метода трябва да се прекръстят, за да няма колизия на имена - затова в рамките на метода MoveDisks имаме sourceRod (това е прътът, който разглеждаме на текщата стъпка като начална точка), destinationRod и spareRod.

2
nrayanov avatar nrayanov 39 Точки

Още веднъж благодаря на всички за помощта!

Кодът в посоченият линк вече е оправен! :)

Поздрави,

Николай Раянов

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.