之前对hanoi塔的递归一直感到很恐惧,我记得原教材上花了好几张纸来描述和解释,一眼望去,满页的伪代码...回过头再看看,发现理解了它的主要思想,写起来是比较容易的,但是精髓至今仍唏嘘不已。那个将三个柱子作为参数并有选择性的调换位置来实现中转作用的方法,我觉得在没有前人脚印的指引下是很难想到的~废话少说。hanoi塔的代码网上很多,就不贴了。主要是理解思想,思想!!
这次要说的是二分搜索。即在有序数列中查找确定数值的一种分治算法,代码如下:
class
BinarySearch
... {
private int equalIndex;
private int indexAdded;
public int EqualIndex
...{
get
...{
return equalIndex;
}
}
public BinarySearch()
...{
equalIndex = 0;
}
public void Search(int n, List<int> list)
...{
int center = list.Count / 2;
if (n == list[center])
...{
equalIndex = center + indexAdded;
return;
}
else
...{
if (n < list[center])
...{
Search(n, list.GetRange(0, center));
}
else
...{
indexAdded += center + 1;
Search(n, list.GetRange(center + 1, list.Count - center - 1));
}
}
}
}
... {
private int equalIndex;
private int indexAdded;
public int EqualIndex
...{
get
...{
return equalIndex;
}
}
public BinarySearch()
...{
equalIndex = 0;
}
public void Search(int n, List<int> list)
...{
int center = list.Count / 2;
if (n == list[center])
...{
equalIndex = center + indexAdded;
return;
}
else
...{
if (n < list[center])
...{
Search(n, list.GetRange(0, center));
}
else
...{
indexAdded += center + 1;
Search(n, list.GetRange(center + 1, list.Count - center - 1));
}
}
}
}
这里要注意的是,为了确保返回的位置是在原整个list中的位置,indexAdded的加入很重要。