解决方案 »
- 自动生成控件后删除行。
- 如何监控用户退出,页面关闭事件,关便用户登录状态
- vs2005 早期版本
- 用正则取得网页中指定的表格,正则的高手们帮帮忙啊,谢谢了
- 请问一个使用COOKIE的问题。
- 弹出窗口不执行Page_Load事件
- 小问题,大家看看!
- C#连接oracle时,无法引用using system.data.oracleclient,在项目的引用上添加引用的时候,也是找不到这个引用
- asp.net中页面类的问题(在线等待)
- 在ASP.NET中,怎么使用户在没有键盘鼠标操作后,间隔一定时间,自动退出系统?
- 刚进公司,做的微信平台,老大让把用户发送的信息自动保存到数据库
- 求一正则替换 地名中的省、区、市、县等字符后加一横
static void Main(string[] args)
{
int count = Foo(30);
Console.WriteLine(count);
} public static int Foo(int i)
{
if (i <= 0)
return 0;
else if (i > 0 && i <= 2)
return 1;
else
{
int a = Foo(i - 1);
int b = Foo(i - 2);
int count = a + b;
return count;
}
} 你这么修改一下 调试时单步走 看看Foo里面a、b、i还有最后count 观察他们的变动
最开始时Main函数里Foo(i)的i取个小一点的值 看下是个什么样流程讲的话还真不知道怎么讲 你也可以画画流程图:
比如求a[4]的值就是下面这么一个流程:
①a[4]=a[3]+a[2],先求a[3]
②a[3]=a[2]+a[1],求a[2]
③a[2]=a[1]+a[0]=2,求出a[2]
④由③,②则改为a[3]=2+a[1],求a[1]=1,②a[3]=2+1=3
⑤由④,①为a[4]=3+a[2],求a[2]
⑥a[2]=a[1]+a[0]=2
⑦由⑥,则⑤里a[4]=3+a[2]=3+2=5
结构式后一个数=前一个数+前前一个数
然后再来看代码
Foo(i -1) + Foo(i - 2)
1+1=2
2+1=3 Foo(3 -1) + Foo(3 - 2) i=3
3+2=3 Foo(4 -1) + Foo(4 - 2) i=4
。。
{
if (x < 1)
throw new InvalidOperationException();
else if (x <= fValues.Count)
return fValues[x - 1];
else
{
var r = f(x - 1) + f(x - 2);
fValues.Add(r);
return r;
}
}
简单输出结果可以写for (var i = 1; i <= 80; i++)
Console.WriteLine("i={0}, f={1}", i, f(i));
var rnd = new Random();
for (var j = 1; j <= 80; j++)
{
var i = rnd.Next(80) + 1;
Console.WriteLine("i={0}, f={1}", i, f(i));
}
这样可以看出运算速度!不要做“过分聪明的”优化。你应该首先考虑将中间结果缓存起来,以后充分利用。如果这样做又可以保证算法与数学公式清晰地对应,又能保证效率较好,何乐而不为呢?不要做过分聪明的优化。
i(3)=i(2)+i(1);
i(4)=i(3)+i(2);
以此类推。
对于i(4)=i(3)+i(2); 来说,i(3)其实又重复i(3)=i(2)+i(1);
{
int count = Foo(30);
Console.WriteLine(count);
}
public static int Foo(int i)
{
if (i <= 0)
return 0;
else if (i > 0 && i <= 2)
return 1;
else
{
int a = Foo(i - 1);
int b = Foo(i - 2);
int count = a + b;
return count;
}
}