C#.Net面試官問:漢諾塔算法
前言
現(xiàn)在不僅各大編程語言卷,也順帶感染了C#的內(nèi)卷。有人面試被問到,漢諾塔算法.這個算法比較有意思。網(wǎng)上C語言較多,本篇來看下C#。
概括
漢諾塔,據(jù)說一個古印度的黃金碟片的游戲。把一根柱子上疊好的一堆碟片從小到大的順序,借助第二根柱子挪到第三根柱子上。
注意這里有幾個點(diǎn)
其一:碟片的數(shù)量
其二:三根柱子
其三:從小到大借助挪動
其四:小碟片必須在大碟片之上,任何一個。
應(yīng)該如何做呢?碟片的數(shù)量未知,這里假設(shè)為n(int)。三根柱子(字符類型),第一根柱子one,第二根柱子two,第三根柱子three。作為參數(shù),可以構(gòu)建如下函數(shù),函數(shù)名為:Hannuo:
static void Hannuo(int n, char one, char two, char three)
{
}
柱子之間碟片的挪動,另取一個函數(shù),用以記錄:
static void move(char x, char y)
{
Console.Write(x + "->" + y + "\r\n");
}
假設(shè)只有一個碟片,直接從柱子1挪到柱子3即可,所以函數(shù)里面需要判斷下:
static void Hannuo(int n, char one, char two, char three)
{
if (n == 1) move(one, three);
}
如果大于1個碟片,假設(shè)為n。則遵循先把n-1個碟片從小到大的順序從柱子1借助柱子3挪到柱子2,然后把剩余的最后一個碟片從柱子1挪到柱子3,最后把柱子2的n-1個碟片從小到大的順序借助柱子1挪到柱子3,完成整個過程。完成代碼如下:
static void Hannuo(int n, char one, char two, char three)
{
if (n == 1) move(one, three);
else
{
Hannuo(n - 1, one, three, two);
move(one, three);
Hannuo(n - 1, two, one, three);
}
}
整個的代碼:
static void Hannuo(int n, char one, char two, char three)
{
if (n == 1) move(one, three);
else
{
Hannuo(n - 1, one, three, two);
move(one, three);
Hannuo(n - 1, two, one, three);
}
}
static void move(char x, char y)
{
Console.Write(x + "->" + y + "\r\n");
}
static void Main(string[] args)
{
Hannuo(3, 'A', 'B', 'C');
Console.ReadLine();
}
這里的Main函數(shù),里面?zhèn)鬟f了3個碟片,然后分別以字符串A,B,C代表三根柱子,進(jìn)行碟片移動最終的結(jié)果是如下:
圖片
三個碟片在三根柱子,A,B,C上進(jìn)行了7次挪動。其它以此類推。這里面主要是遞歸算法。