用这种方法就无需将数列中的每一个元素都计算一遍了!
说多无谓,直接上代码吧!
private void button5_Click(object sender, EventArgs e)
{
FiBoNaQi f = new FiBoNaQi();
f.numberToCount = (Int16)numericUpDown1.Value;
f.DoFiBoNaQi((Int16)numericUpDown1.Value);
MessageBox.Show(f.StrResult);
}
class FiBoNaQi
{
StringBuilder strResult = new StringBuilder();
//用于推算已经加入到字符串结果中的数,以免重复打印
int nowPercent = 0;
//斐波那契number
public int numberToCount = 0;
public long DoFiBoNaQi(int count)
{
long result = 0;
if (count == 1)
{
result = 1L;
}
//必须考虑这种情况,否则如果numberToCount是偶数的时候将漏打1的结果
//如果不考虑0,那么number是1或2的时候就将结果返回来了,如果number是偶数
//先执行DoFiBoNaQi(count - 1),马上返回number为2的结果,用于这个条件 if (percent > nowPercent)
//的限制,1的结果就返回不了了(或者说加入到结构字符串中)
else if (count == 0)
{
result = 0L;
}
else
{
//只要return,函数就不会继续下探导致无限循环内存溢出。如果不考虑0,注意2和1的顺序。
result = DoFiBoNaQi(count - 1) + DoFiBoNaQi(count - 2);
//result = DoFiBoNaQi(count - 2) + DoFiBoNaQi(count - 1);
}
//罗列出来,这里也算0的,但是直接return 0,资源消耗不大,没关系
int percent = (int)((double)count / (double)numberToCount * 100);
//零是无法返回的,可以重写一下
if (percent > nowPercent)
{
nowPercent = percent;
strResult.Append(result + "\t");
if (count % 5 == 5)
strResult.Append("\t\n");
}
return result;
}
}