苏老师教育杂记
日历
网志分类
· 所有网志
· 2011夜大毕业设计
· § 日大毕业设计
· C语言程序设计
· VB等级考试
· § 大学教育
· § 程序人生
· § 社会万象
· § 杂七杂八
· § 不厌好歌
· § 搭建博客
· § 交换链接
· § 发明创造
· § 毕业实习
· § os 课程设计
· 未分类
最新的评论
站内搜索
友情链接
· 歪酷博客
· 我的歪酷
· 魏书生教育思想
· 吴小莉的个人博客
· 上海社工
· 麻省开放式课程
· 侬好上海
· 韦钰院士的科学教育
· 张海迪我的偶像
· 开复学生网
· 凤凰网
· 人格心理学
· 草根养分
· 科学院ftp
· 搏彩网
· 雪中影的幽幽雪中屋
· 网络主题探究
· 中国穆斯林
· 生物图象处理 best
· 中国科大微笑在线
· 师道梦想博客
· 诺贝尔物理学奖历史回顾
· 美丽的木兰围场
· 大四70
· 山城棒棒儿matlab
· 大四后的记忆
· 天津的雷欧老八
· 盘丝洞的笨笨妖
· 日月光华
· 北大天网
· 大一stfedy
· 默林的似水流年
· google搜索
· 忘却的记忆
· 饮水思源BBS
· 复旦的芦苇
· 西湖旁的呢喃写生
· 菩提树下的旧事
· 叶儿飞
· 草祭的情绪
· 证券大厦的小羊
· 醒悟远程心理教育
· 去找回childhood
· 小小小罗
· 科学颜色 ——魔方世界
· 科学美国人
· 科学美国人英文版
· 中国互联网协会
· 大一随想空间
· 中国科大瀚海星云
· del.icio.us美味书签
· 露雨城市-南京.NET爱好者
· 中国互联网黄页
· 中国计算机学会

订阅 RSS

0105123

歪酷博客

----------友情提示:  博客重新开张了---------
少玩点游戏,把玩游戏的时间花在学编程上,要是你能把编程当成游戏来玩,那恭喜你
苏老师 @ 2008-11-01 15:44


  C语言程序设计对于现阶段的学生来说,是一门较难掌握的课程。其中,数组这一章的内容更是难点。如何上好数组这一章,一直是C语言教师讨论的热点。
通过这几年的实践,本人也总结了一些关于C语言程序设计中数组单元的教学经验,在此提出来以供大家参考。
  数组这一章的难点在于数组的概念,当弄清了基本概念后,再进行数组的应用。循序渐近,打好基础,由点到面,重在应用。关键在于基础是否牢靠。
如何进行数组概念的讲解,我认为主要抓住一点:数组就是一组变量的集合,但又不单纯是变量的简单集合,而是一组互相关联,有一定关系的变量。
这组变量的关系如下:
  1、其数组名相同,下标以等差数列依次排列。
  2、以一维数组a[10]为例,该数组成员分别是a[0]、a[1]、a[2]……a[9]。在内存中各成员的位置以下标为序,在内存地址中依次升序存放。所以,当我们找到了某数组中任一个成员的地址,即可以通过该地址找到其他所有成员。
  清楚这一点后,可以进行较深入的讲解。其中,有几个重要知识是必须要强调的。首先要讲清楚任何一个数组其成员的下标都是从0开始的,而在定义过程中的下标仅指数组长度。例如:
main( )
{ int a[ 5 ] ;
a[0]=1; a[1]=2; a[2]=3; a[3]=4; a[4]=5 ;
}
  这个程序中定义了一个数组a,而在定义时的语句:int a[5]; 中的5指的是数组a的长度为5,即他的组成元素个数为5个。其下标从0到4,所以在程序中被定义的变量是a[0]、a[1]、a[2]、a[3]、a[4],所以这个程序中可以用上面5个变量,如果出现了如下情况:
main( )
{ int a[ 5 ] ;
a[1]=1; a[2]=2; a[3]=3; a[4]=4; a[5]=5 ;
}
  则不对了,因为在该程序中没有定义变量a[5],这个程序中却用到了这个变量,C语言语法中有一条“变量要先定义再使用”,所以该程序错误。
其次,数组中分为一维数组、二维数组、三维数组……直至多维数组,清楚地讲明了各维数组的概念后,应从一维数组讲起,从简单入手,向复杂递进,高中阶段只需讲到二维数组即可。
  一维数组的讲解,除了概念外,主要是实例的掌握。由于讲到数组时大家已经有了简单编程的基础,所以可以结合前面的知识点来学习。
在说明一维数组时,可以先举出如下例子:
main( )
{ int a[5],n ;
for ( n=0; n<4; n++)
{ a[n] = n ;
printf ( “%3d ” , a[n]);}
}
  这个程序在循环程序设计的基础上使用了数组。此时,可以给大家进行对比,如果用简单的变量来实现该程序,则需定义至少六个变量,如果换一道题,要给一百个变量赋值,就必须定义一百个变量,通过这种较为夸张的比方,让学生们自己体会数组与一般变量的区别,并进一步说明数组的特点以及使用数组进行编程的优点。最终得出结论:数组的优点在于能够简化程序设计的复杂性。
  对于一维数组,有几道较为典型的例题,其中若干个数字的排序是最为重要的。我们可把“冒泡法”排序和“选择法”排序作为一个切入点,深入地进行数组的学习。
“选择法”排序源程序如下:
main( )
{
int n, m , min , a[10]={3,4,7,2,5,0,12,54,23,53};
for (n=0;n<=9;n++)
for (m=n+1;m<=9;m++)
if a[n]>a[m]
{ min=a[n];
a[n]=a[m];
a[m]=min;
}
for (n=0;n<=9;n++)
printf(“%3d”,a[n]);
}
  上例程序中选择法排序的对象是十个数,如果用一般的变量来做这道题,将定义十个变量,而且在比较排序过程中不能使用循环的方法一次解决问题。用数组的话就可以很方便地解决这个问题。
“冒泡法”排序源程序如下:
main( )
{
int n, m , min , a[10]={3,4,7,2,5,0,12,54,23,53};
for (n=0;n<=9;n++)
for (m=n;m<=8;m++)
if a[m]>a[m+1]
{ min=a[m];
a[m]=a[m+1];
a[m+1]=min;
}
for (n=0;n<=9;n++)
printf(“%3d”,a[n]);
}
  。。。。。。



 
苏老师 @ 2008-11-01 15:34

看以下连接如题:如果高中刚毕业,从未接触过C语言,从哪里学起?
真的很想自学,自小对软件工程很感兴趣,认为做软件开发就是牛人。所以很想自学。暑假感到很无聊,希望充实点。
望大侠们指点一二。谢谢!



windowsmac 发布留言 2008-6-1 12:10

我是一名初一生,正在学着C语言,没感觉躲到多难,估计楼主是不是真的喜欢C语言,没有兴趣在怎么学习也是白费,高中的知识学起C来不是很困难吧,我的自我感觉o(∩_∩)o...

flyue 发布留言 2008-6-1 12:11

恩,那然。LZ我告诉你吧,少玩点游戏,把这些玩游戏的时间花在学编程上,
要是你能把编程当成游戏来玩,那恭喜你
给自己定一个目标,比如像我
,我就是想做一个象样的游戏,你也可以象LS姐姐一样研究算法。哪怕你想当黑客也行,问题是你能不能一直坚持学下去。
我是学了2年,从初三开始接触编程的。

z6532329 发布留言 2008-6-2 19:11

很高兴

感谢大家的支持!c语言的书我看过,是不是潭浩强的忘了,高2时看的。这个礼拜回家把书拿过来看看。有不懂的希望大家帮帮忙。我现在工作了,在烟台。有时间,玩了1年多网络游戏,感觉太无聊了。想把玩游戏的时间用来学习编程。不知道多久才能从鸟蛋变成菜鸟!


 
苏老师 @ 2008-11-01 15:31

下面程序的功能是计算1至10之间的奇数之和以及偶数之和。请填空。
main( )
{ int x, y, z, k;
x=z=0;
for (k=0; k<=10; k+=2)
{ x+=k;
               ;
z+=y;
}
printf("偶数之和 = %d\n", x);
printf("奇数之和 =%d\n",                   );

大家来 做做。   别把自己搞复杂了。


 
苏老师 @ 2008-11-01 15:12

C语言总结(1)—从一道例题说开…
引子
你的高数笔记真的很棒。
呵呵,客气了。
但是对于我这样的高数不好的来说,似乎没有什么用处。有时候我愿意以把它当成一部数学辞典。
哦?为什么?
因为我不知道那些混合着变量和符号的公式代表着什么意思,红色下划线和蓝色下划线有什么不同的意义没有?我不知道,你在上面有没有提及,还有那该死的数据图,我倒更愿意相信你是在画一头大象。
呵呵,那也倒是。你有什么建议么?
从例子入手。
青岛市图书馆二楼图书阅览教室 08.1.16
题目来源: C语言开发入门与编程实践》
题目:促销三种商品,再按照顾客的消费金额进行打折优惠,促销的商品资料:
商品代码
商品名称
价格
X
电冰箱
10000
Y
冷气机
15000
Z
个人计算机
25000
折扣表为
消费金额
折扣
15万元
15%
10万元
10%
5万元
5%
题目要求:switch来编写一个程序,依据商品金额和购买数量,计算出总消费金额,折扣和应消费金额。
程序:
 
/*商品金额和折扣的计算*/
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
      char select;
       int g_num;
       double total, amount, discount;
 
      printf("请输入购买的商品代码x(电冰箱),y(冷气机),z(个人计算机)");
       scanf("%c", &select);
    printf("请输入购买数量:");
       scanf("%d", &g_num);
    printf("---------------------------------------\n");
      switch(select)
       {
       case ''x'':  
       case ''X'':
              total=10000*g_num;
              break;
       case ''y'':
       case ''Y'':
              total=15000*g_num;
              break;
       case ''z'':  
       case ''Z'':
              total=25000*g_num;
              break;
       }
       if (total>=100000)
              discount=total*0.15;
       else if (total>=50000) 
              discount=total*0.1;
       else
              discount=total*0.05;
     
      amount=total-discount;
      printf("总购买金额为: %.2f\n", total);      
       printf("折扣金额为: %.2f\n", discount);
       printf("应付金额为: %.2f\n", amount);
      
    system("pause");
    return 0;    
}
   
为什么开始的时候不用点简单的程序?因为简单的程序不能完全展现出C语言的面向过程的风格。
用实际生活的日子是为了更好的理解吗?对的,编程是为了让我们更好的生活的。他不是怪物,而是一个可以为我们所用的工具。ok,现在我们来通过这个程序学习C语言的基础知识。
1.大的方面
现在我们先把这个程序分成七个模块。C语言通常可以分以下七个模块。(相同颜色在程序中标注了。)
第一个模块是预处理模块。
第二个模块是main主函数.
第三个模块是各种类型的变量声明及变量初始化。
第四个模块是输入输出函数。
第五个模块是判断(此例用了switch,if…else做判断)
第六个模块是表达式。这里用到了一点数学基础,特别是面对抽象的题目的时候。
第七个就是输出和程序结束。

这个程序程序基本展现出C语言的面向过程的风格,面向过程开发实际上是结构化程序设计在代码阶段一个习惯性的说法。结构化编程的基本单位是过程过程有了,模块很快就出来了。然后大模块分成小模块,小模块分成更小的模块,一个模块对应一个单元,大家分工写代码。这样源代码分散开来,结构化编程便开始了。或许有人会说为什么不写到一块去呢?实际上写到一块去是可以的。但是软件维护怎么办?这是一个问题,最要命的是日后遇到客户不同的需求,你怎么去改代码?这可是牵一发动全身的事情,于是有了重构这东西。但是还是建议一开始就分散开来做,在此例中折扣和消费总金额是分开的,要改动是非常easy的事情。现在面向对象思想非常的火爆,但是真正做大型的软件,还是面向过程的。我们初学编程的,切忌浮躁。
2.小的方面我们开始各个击破。
第一个模块:预处理模块
1)在一个完整的C语言里面必须有预处理指令。
2)预处理指令在程序的最前面。
3#include指令的作用就是告诉编译器要加入哪些C程序中所定义的目标文件或指令。
例如此例程序中用到了输入输出printfscanf,还有system.编译器不认识他们,#include指令便先和他打了个招呼:嘿!printfscanf来自头文件stdio.hsystem来自头文件stdlib.h,在程序里遇见了关照一下哈。
第二个模块是main主函数.
1)每一个C程序有且只能有一个main函数,main函数相当于一个C程序的脊椎,让C程序站起来,活跃于各种系统之间。当然,你不要忘了大括号{}的功劳。
2int main 函数的返回值类型,它表明 main 函数应该返回一个整数给程序的调用者(如操作系统)。
3void main() { /* ... */ }既不是C++,也不是C。(参见ISO C++ 标准 3.6.1[2])一个遵从标准的编译器实作应该接受 int main() { /* ... */ }int main(int argc, char* argv[]) { /* ... */ }。编译器也可以提供main()的更多重载版本,不过它们都必须返回int,这个int是返回给你的程序的调用者的,这是种负责的做法,什么都不返回可不大好哦。如果你程序的调用者不支持用返回值来交流,这个值会被自动忽略——但这也不能使void main()成为合法的C++C代码。即使你的编译器支持这种定义,最好也不要养成这种习惯——否则你可能被其他C/C++程序员认为浅薄无知哦。
第三个模块是各种类型的变量声明及变量初始化。
1charintdoublefloat都属于基本数据类型。
char是字符型,代表字符啦;
int是整型,int代表整数啦;
doublefloat是浮点型,代表小数啦。不同就在于值的范围啦。doublefloat多哦。没事就用double吧。
2)变量声明嘛?比如int a就说明变量a已经被声明为整型(int)a的值只能是以整数的形式出现,不能以小数(double)的形式出现。
3)初始化?接上面 int a=5就说明变量a已经被声明为整型(int),且a被赋值为5,记住是赋值哦,“=”C语言里是赋值的意思。“==”才是等于
第四个模块是输入输出函数。
1)你想在屏幕上写点什么,就来点printf函数吧。printf函数称为格式输出函数,最末一个字母f即为格式”(format)之意。他能把指定的数据显示到显示器屏幕上。
2)如果你的程序要服务于大众,最好有scanf这种函数。scanf函数称为格式输入函数,他能按用户指定的格式从键盘上把数据输入到指定的变量之中。
第五个模块是判断(此例用了switch,if…else做判断)
1) 逻辑判断就三种:顺序,选择,循环。循环最难对付,而在大程序里,你是避不开循环的,它吃定你了。训练你的数学逻辑和伪码能力吧。
2) 此例用到的是选择结构,switchifelse并列使用,很漂亮对不对?多看点类似的程序,有助于你自己的编码结构的优化。
第六个模块是表达式。这里用到了一点数学基础,特别是面对抽象的题目的时候。
这里的东西与程序没有太多关系,你的数学一定要好才行。事实上做此类题型最先开始的不是些预处理命令,而是思考表达式,把表达式所要的变量拿出来声明或者直接初始化。由此推论就是当你看一个C语言程序时,最最关键的不是结果,而是推演结果的过程,《beginning of C》是我见过的关于这方面最好的书。
第七个就是输出和程序结束。
这里没有什么好说的,有人会问return 0是什么东东?简单的说return 0是表示此程序正常结束。
 
说完了,下一节详细说各个部分的基本概念。


 
苏老师 @ 2008-11-01 14:45

题目要求输入一个数,判断是否是素数,打印出结果.
两种方法
1) 采用标志量 
       先假设是的(X=0), 接着进行循环 如果整除 就变成X=1,退出循环,后面整除就不用做了。 最后判断x还是0,很明显是素数。 

2) 采用中途退出即不是素数。  中途没退出即是素数。
       判断循环变量 是否小于终值+步长。



 
苏老师 @ 2008-11-01 13:42

    C语言是计算机专业必须学习一门纯粹的经典的语言, 它很原始,但很精辟, 可能我们以后要面对更加高级的C++, JAVA or C#。但是c语言是程序设计系统训练的很好学习工具,你不要想饶过去。
      一般我们学习一种语言无外乎控制结构,数据类型,函数过程,文件。
    1)控制结构有顺序,选择和循环。 
    2)数据类型有整数,长整数,单精度,双精度的,字符型,数组,指针,公用类型
    3)函数过程, 如函数编写,函数原型,参数传递。
    4)文件处理, 如文件基本概念。 打开,读写 关闭。
   C语言学习的基础是
   1)要对计算机的数制要会转换, 2,8,16,10
   2)对ASCII码要清晰。  0------30h,     A-----41h , a-----61h.  
   3)逻辑基础,如 与,或,非含义
   4) 源程序--机器语言

    第一部分概述学习
    学习c的基本结构, 主函数, 变量起名字, 要根据数据的特性分配类型。
  1)  main()  {      }      区分大小写的。每句要写;.      两句话要加 {  }  同时  单个 ;是空语句。
  2) int a ;    定义变量 a  为整数。
         这里要明确 数据三要素-------定义 -----初始化------使用
                                                           dim a        a=3             c=2*a  
  3)明确--已知---求----解的意义
                 输入    输出   处理
  4)目前先照样子,写个程序。  scanf("%d",&a);  printf("a=%d",a);
  5)学会用TURBOC2.0编辑,编译程序,看结果
        alt+F9  --------ctrl+F9----------alt+F5---------F6   F5 ------能够熟练掌握这个流程。

      第二部分数据类型学习
    1)  int    %d       long   %ld   float  %f    double %lf    char %c   字符串 %s
    2) I++,   ++I.  问题很简单  主要根据还原的方式来进行 测试。
     
     第三部分
     选择语句
     1) 单分支, 双分支, 多分支
             if  () ;           if ()  ; else ;      switch   case  break 
     2)   ==()?a:b;
  
     第四部分
       循环语句
         只要掌握for即可, 要明确 for(控制变量=初值;控制变量<=终值;步长)循环体;
       搞清循环次数, 循环做完,循环变量的值是多少, 还有中间退出的话, 需要break。

   截止目前要学习的应用有
   1) 判断奇偶数的方法。i%2
   2) 换油瓶方法
   3) 打印简单图形
          a)   printf("*");    printf("*\n");  会换行。
          b)   for(i=1;i<=10;i++)printf("*");       +++  printf("%d",i);  必须搞清.
          c)   for(i=1;i<=10;i++)printf("*\n");
          d)  for(i=1;i<=100;i++){ printf("*"); if (i%10==0)printf("\n");}    括号里面的 交换的结果是什么?
          e)  ****************************************************************
          f)   ***********
                ***********
                ***********
                ***********
                ***********
           g) *
                **
                ***
                ****
                *****
            h) *
                ??
                $$$
                &&&&
                @@@@@
           i) for(; i<=10;i++) 变换的理解
     待续....................................                 



 
苏老师 @ 2008-10-25 00:09

[原创]数学建模竞赛中应当掌握的十类算法
排名如下:
1、蒙特卡罗算法(该算法又称随机性模拟算法,是通过计算机仿真来解决问题的算法,
同时可以通过模拟可以来检验自己模型的正确性,是比赛时必用的方法)
2、数据拟合、参数估计、插值等数据处理算法(比赛中通常会遇到大量的数据需要处理
,而处理数据的关键就在于这些算法,通常使用Matlab作为工具)
3、线性规划、整数规划、多元规划、二次规划等规划类问题(建模竞赛大多数问题属于
最优化问题,很多时候这些问题可以用数学规划算法来描述,通常使用Lindo、Lingo软
件实现)
4、图论算法(这类算法可以分为很多种,包括最短路、网络流、二分图等算法,涉及到
图论的问题可以用这些方法解决,需要认真准备)
5、动态规划、回溯搜索、分治算法、分支定界等计算机算法(这些算法是算法设计中比
较常用的方法,很多场合可以用到竞赛中)
6、最优化理论的三大非经典算法:模拟退火法、神经网络、遗传算法(这些问题是用来
解决一些较困难的最优化问题的算法,对于有些问题非常有帮助,但是算法的实现比较
困难,需慎重使用)
7、网格算法和穷举法(网格算法和穷举法都是暴力搜索最优点的算法,在很多竞赛题中
有应用,当重点讨论模型本身而轻视算法的时候,可以使用这种暴力方案,最好使用一
些高级语言作为编程工具)
8、一些连续离散化方法(很多问题都是实际来的,数据可以是连续的,而计算机只认的
是离散的数据,因此将其离散化后进行差分代替微分、求和代替积分等思想是非常重要
的)
9、数值分析算法(如果在比赛中采用高级语言进行编程的话,那一些数值分析中常用的
算法比如方程组求解、矩阵运算、函数积分等算法就需要额外编写库函数进行调用)
10、图象处理算法(赛题中有一类问题与图形有关,即使与图形无关,论文中也应该要
不乏图片的,这些图形如何展示以及如何处理就是需要解决的问题,通常使用Matlab进
行处理)


 
苏老师 @ 2008-10-25 00:06

 

计算机科学与技术学习心得

撰文 曾毅

声明:

1.本文集众前辈及恩师之经验于一文,由我执笔总结前辈所感而已。并非尽我所言,特别说明基于南京大学网友sir在南京大学小百合站点发表的文章《理论计算机科学漫谈》、《胡侃学习(理论)计算机》、《胡侃学习计算机--理论之外》并融入我的若干观点。

2.2004121417日,网友“剑指长空催云雨BerkeleyWolf”和“挨踢客”对本文的前期版本提出批评,认为“Sir博士文章中的原文在你的文章中应当注明。我认识到:在我大学三年级撰写此文时引用南京大学网友Sir文章以及我校司徒彦南学长观点而没有以正确的引用方式注明,即使作为网络上流传的文章来说仍然是不正确的。目前对此版本的文章我采取用蓝色字体标注并用表格框起引用的方式来引用Sir的文章观点以及司徒彦南学长言论,这也是我们对别人成果最正确的引用态度。我接受您这个意见并在今天修改好文章在仅放在我的个人主页上此处位置。但杜绝任何媒体以任何形式转载和引用以免文章内容和引用说明被删节。

3. 新语丝网站网友“醉里挑灯看剑”撰写的评论,虽有不符实之处(详细情况见此链接), 但是初衷是提醒我我的文章有问题。并由此引发了剑指长空催云雨BerkeleyWolf”和“挨踢客”的批评,仍应感谢他提醒我学术剽窃问题的严重性。

4. 感谢各位网友警示我做学术论文的正确方法。如修改版本仍有不妥之处请通过zengyi820@hotmail.com 与我取得联系,我将按照您的正确建议修改文章的不妥之处。由于网络文章转载不可控,修改文章的最新版本将仅在以下地址更新。http://www.zengyihome.net/articles/st/xxxd2.htm

5. 对“BerkeleyWolf”和“挨踢客”等网友提出的“引用注明出处”的建议和意见表示感谢。对南京大学网友Sir文章以及司徒彦南学长观点不正确的引用方式郑重道歉对新语丝网站方舟子先生评论“参考方式不正确”的批评表示感谢。

6. 本文早期版本曾流传于其它网站,本文虽经多次修订,仍有诸多不妥之处,有待笔者进一步学习之后修订此文,文章侧重理论学习兼谈实践。

----------------最后修订:20041218

 

计算机科学与技术这一门科学深深的吸引着我们这些同学们,上计算机系已经有近三年了,自己也做了一些思考,原先不管是国内还是国外都喜欢把这个系分为计算机软件理论、计算机系统、计算机技术与应用。后来又合到一起,变成了现在的计算机科学与技术。

司徒彦南提到:我一直认为计算机科学与技术这门专业,在本科阶段是不可能切分成计算机科学和计算机技术的,因为计算机科学需要相当多的实践,而实践需要技术;每一个人(包括非计算机专业),掌握简单的计算机技术都很容易(包括原先Major们自以为得意的程序设计),但计算机专业的优势是:我们掌握许多其他专业并不"深究"的东西,例如,算法,体系结构,等等。非计算机专业的人可以很容易地做一个芯片,写一段程序,但他们做不出计算机专业能够做出来的大型系统。

今天我想专门谈一谈计算机科学,并将重点放在计算理论上。

       在我大一时无意中找到了南京大学网友sir的帖子"胡侃(理论)计算机学习",这个帖子对我大学学习起到了至关重要的指导作用,我在这篇文章成文的时候正是基于sir的文章做得必要的补充和修改,并得到了sir的支持。再有就是每次和本系司徒彦南兄的交谈,都能从中学到很多东西,在这份材料中也有很多体现。这份材料是我原来给学弟学妹们入学教育的讲稿之一,原有基础上改进了其中我认为不太合适的理论,修正了一些观点,在推荐教材方面结合我的学习情况有了较大改变。值得一提的是增加了一些计算机理论的内容,计算机技术的内容结合我国的教学情况和我们学习的实际情况进行了重写。这里所作的工作也只是将各位学长和同学们的学习体会以及我在学习计算机科学时的所思所想汇总在一起写了下来,很不成熟。目的就是希望能够给一些刚入学或者是学习计算机科学还没有入门的同学以一些建议。不期能够起到多大的作用,但求能为同学们的学习计算机科学与技术带来微薄的帮助。还是那句话,计算机科学博大精深,我只是个初学者,不当之处希望大家批评指正。

1、计算机理论的一个核心问题--从数学谈起:

  [1]高等数学Vs数学分析

  记得当年大一入学,每周四课时高等数学。我国计算机科学系里的传统是培养做学术研究,尤其是理论研究的人(方向不见得有多大的问题,但是做得不是那么尽如人意)。而计算机的理论研究,如网络安全学,图形图像学,视频音频处理,哪个方向都与数学有着很大的关系。这里我还想阐明我的一个观点:我们都知道,数学是从实际生活当中抽象出来的理论,人们之所以要将实际抽象成理论,目的就在于想用抽象出来的理论去更好的指导实践,有些数学研究工作者喜欢用一些现存的理论知识去推导若干条推论,殊不知其一:问题考虑不全很可能是个错误的推论,其二:他的推论在现实生活中找不到原型,不能指导实践。严格的说,我并不是一个理想主义者,政治课上学的理论联系实际一直是指导我学习科学文化知识的航标 (至少我认为搞计算机科学与技术的应当本着这个方向)

  其实我们计算机系学数学仅学习高等数学是不够的 (典型的工科院校一般都开的是高等数学),我们应该像数学系一样学一下数学分析(清华计算机系开的好像就是数学分析,我们学校计算机学院开的也是,不过老师讲起来好像还是按照高等数学讲),数学分析这门科学,咱们学计算机的人对它有很复杂的感情。在于它是偏向于证明型的数学课程,这对我们培养良好的分析能力和推理能力极有帮助。我的软件工程学导师北工大数理学院的王仪华先生就曾经教导过我们,数学系的学生到软件企业中大多作软件设计与分析工作,而计算机系的学生做程序员的居多,原因就在于数学系的学生分析推理能力,从所受训练的角度上要远远在我们平均水平之上。当年出现的怪现象是:计算机系学生的高中数学基础在全校数一数二(希望没有冒犯其它系的同学),教学课时数也仅次于数学系,但学完之后的效果却不尽如人意。难道都是学生不努力吗,我看未见得,方向错了也说不一定,其中原因何在,发人深思。

Sir的文章中提到:我个人的浅见是:计算机系的学生,对数学的要求固然跟数学系不同,跟物理类差别则更大。通常非数学专业的所谓“高等数学,无非是把数学分析中较困难的理论部分删去,强调套用公式计算而已。而对计算机系来说,数学分析里用处最大的恰恰是被删去的理论部分。说得难听一点,对计算机系学生而言,追求算来算去的所谓"工程数学"已经彻底地走进了误区。记上一堆曲面积分的公式,难道就能算懂了数学?

  那倒不如现用现查,何必费事记呢?再不然直接用Mathematica或是Matlab好了。 退一万步讲,即使是学高等数学我想大家看看华罗庚先生的《高等数学导论》也是比一般的教材好得多。华罗庚在数学上的造诣不用我去多说,但是他这光辉的一生做得我认为对我们来说,最重要的几件事情: 首先是它筹建了中国科学院计算技术研究所,这是我们国家计算机科学的摇篮。在有就是他把很多的高等数学理论都交给了做工业生产的技术人员,推动了中国工业的进步。第三件就是他一生写过很多书,但是对高校师生价值更大的就是他在病期间在病床上和他的爱徒王元写了《高等数学引论(王元与其说是他的爱徒不如说是他的同事,是中科院数学所的老一辈研究员,对歌德巴赫猜想的贡献全世界仅次于陈景润)这书在我们的图书馆里居然找得到,说实话,当时那个书上已经长了虫子,别人走到那里都会闪开,但我却格外感兴趣,上下两册看了个遍,我的最大收获并不在于理论的阐述,而是在于他的理论完全的实例化,在生活中去找模型。这也是我为什么比较喜欢具体数学的原因,正如我在上文中提到的,理论脱离了实践就失去了它存在的意义。正因为理论是从实践当中抽象出来的,所以理论的研究才能够更好的指导实践,不用于指导实践的理论可以说是毫无价值的。

  我在系里最爱做的事情就是给学弟学妹们推荐参考书。没有别的想法,只是希望他们少走弯路。中文的数学分析书,一般都认为以北大张筑生老师的"数学分析新讲"为最好。张筑生先生一生写的书并不太多,但是只要是写出来的每一本都是本领域内的杰作,这本当然更显突出些。这种老书看起来不仅是在传授你知识,而是在让你体会科学的方法与对事物的认识方法。万一你的数学实在太好,那就去看菲赫金哥尔茨?quot;微积分学教程"好了--但我认为没什么必要,毕竟你不想转到数学系去。吉米多维奇的"数学分析习题集"也基本上是计算型的书籍。书的名气很大,倒不见得适合我们,还是那句话,重要的是数学思想的建立,生活在信息社会里我们求的是高效,计算这玩意还是留给计算机吧。不过现在多用的似乎是复旦大学的《数学分析》,高等教育出版社的,也是很好的教材。

Sir的文章中提到:中国的所谓高等代数,就等于线性代数加上一点多项式理论。我以为这有好的一面,因为可以让学生较早感觉到代数是一种结构,而非一堆矩阵翻来覆去。这里不得不提南京大学林成森,盛松柏两位老师编的"高等代数",感觉相当舒服。此书相当全面地包含了关于多项式和线性代数的基本初等结果,同时还提供了一些有用的又比较深刻的内容,如Sturm序列,Shermon

Morrison公式,广义逆矩阵等等。可以说,作为本科生如能吃透此书,就可以算是高手。国内较好的高等代数教材还有清华计算机系用的那本,清华出版社出版,书店里多多,一看就知道。从抽象代数的观点来看,高等代数里的结果不过是代数系统性质的一些例子而已。莫宗坚先生的《代数学》里,对此进行了深刻的讨论。然而莫先生的书实在深得很,作为本科生恐怕难以接受,不妨等到自己以后成熟了一些再读。

 正如上面所论述的,计算机系的学生学习高等数学:知其然更要知其所以然。你学习的目的应该是:将抽象的理论再应用于实践,不但要掌握题目的解题方法,更要掌握解题思想,对于定理的学习:不是简单的应用,而是掌握证明过程即掌握定理的由来,训练自己的推理能力。只有这样才达到了学习这门科学的目的,同时也缩小了我们与数学系的同学之间思维上的差距。

 [2]计算数学基础

Sir的文章中提到:概率论与数理统计这门课很重要,可惜大多数院校讲授这门课都会少些东西。少了的东西现在看至少有随机过程。到毕业还没有听说过Markov过程,此乃计算机系学生的耻辱。没有随机过程,你怎么分析网络和分布式系统?怎么设计随机化算法和协议?据说清华计算机系开有"随机数学",早就是必修课。另外,离散概率论对计算机系学生来说有特殊的重要性。而我们国家工程数学讲的都是连续概率。现在,美国已经有些学校开设了单纯的"离散概率论"课程,干脆把连续概率删去,把离散概率讲深些。

我们不一定要这么做,但应该更加强调离散概率是没有疑问的。这个工作我看还是尽早的做为好。

  计算方法学(有些学校也称为数学分析学)是最后一门由数理学院给我们开的课。一般学生对这门课的重视程度有限,以为没什么用。不就是照套公式嘛!其实,做图形图像可离不开它,密码学搞深了也离不开它。而且,在很多科学工程中的应用计算,都以数值的为主。

Sir的文章中提到:这门课有两个极端的讲法:一个是古典的"数值分析",完全讲数学原理和算法;另一个是现在日趋流行的"科学与工程计算",干脆教学生用软件包编程。

我个人认为,计算机系的学生一定要认识清楚我们计算机系的学生为什么要学这门课,我是很偏向于学好理论后用计算机实现的,最好使用C语言或C++编程实现。向这个方向努力的书籍还是挺多的,这里推荐大家高等教育出版社(CHEP)和施普林格出版社(Springer)联合出版的《计算方法(Computational Methods),华中理工大学数学系写的 (现华中科技大学),这方面华科大做的工作在国内应算是比较多的,而个人认为以这本最好,至少程序设计方面涉及了:任意数学函数的求值,方程求根,线性方程组求解,插值方法,数值积分,场微分方程数值求解。李庆扬先生的那本则理论性过强,与实际应用结合得不太紧,可能比较适合纯搞理论的。

 [3]也谈离散数学  

每个学校本系里都会开一门离散数学,涉及集合论,图论,和抽象代数,数理逻辑。不过,这么多内容挤在离散数学一门课里,是否时间太紧了点?

Sir的文章中提到:另外,计算机系学生不懂组合和数论,也是巨大的缺陷。要做理论,不懂组合或者数论吃亏可就太大了。从理想的状态来看,最好分开六门课:集合,逻辑,图论,组合,代数,数论。这个当然不现实,因为没那么多课时。也许将来可以开三门课:集合与逻辑,图论与组合,代数与数论。(这方面我们学校已经着手开始做了)不管课怎么开,学生总一样要学。下面分别谈谈上面的三组内容。古典集合论,北师大出过一本《基础集合论》不错。

数理逻辑,中科院软件所陆钟万教授的《面向计算机科学的数理逻辑》就不错。现在可以找到陆钟万教授的讲课录像,http://www.cas.ac.cn/html/Dir/2001/11/06/3391.htm自己去看看吧。

Sir的文章中提到:总的来说,学集合/逻辑起手不难,普通高中生都能看懂。但越往后越感觉深不可测。学完以上各书之后,如果你还有精力兴趣进一步深究,那么可以试一下GTM系列中的《Introduction to Axiomatic Set Theory》和《A Course of Mathematical Logic》。这两本都有世界图书出版社的引进版。你如果能搞定这两本,可以说在逻辑方面真正入了门,也就不用再浪费时间听我瞎侃了。据说全中国最多只有三十个人懂图论。此言不虚。图论这门科学,技巧性太强,几乎每个问题都有一个独特的方法,让人头痛。不过这也正是它魅力所在:只要你有创造性,它就能给你成就感。

  我的老师说,图论里面随便找一块东西就可以写篇论文。大家可以体会里面内容之深广了吧!国内的图论书中,王树禾老师的"图论及其算法"非常成功(顺便推荐大家王先生的"数学思想史",个人认为了解科学史会对我们的学习和研究起到很大的推动作用)。一方面,其内容在国内教材里算非常全面的。另一方面,其对算法的强调非常适合计算机系(本来就是科大计算机系教材)

Sir的文章中提到:有了这本书为主,再参考几本翻译的,如Bondy & Murty的《图论及其应用》,人民邮电出版社翻译的《图论和电路网络》等等,就马马虎虎,对本科生绝对足够了。再进一步,世界图书引进有GTM系列的"Modern Graph Theory"。此书确实经典!国内好象还有一家出版了个翻译版。不过,学到这个层次,还是读原版好(说实话,主要是亲身体验翻译版的弊端,这个大家自己体会)搞定这本书,也标志着图论入了门。

  离散数学方面我们北京工业大学有个世界级的专家,叫邵学才,复旦大学概率论毕业的,教过高等数学,线性代数,概率论,最后转向离散数学,出版著作无数,论文集新加坡有一本,堪称经典,大家想学离散数学的真谛不妨找来看看。这老师的课我专门去听过,极为经典。不过你要从他的不经意的话中去挖掘精髓。在同他的交谈当中我又深刻地发现一个问题,虽说邵先生写书无数,但依他自己的说法每本都差不多,我实在觉得诧异,他说主要是有大纲的限制,不便多写。这就难怪了,很少听说国外写书还要依据个什么大纲(就算有,内容也宽泛的多),不敢越雷池半步,这样不是看谁的都一样了。外版的书好就好在这里,最新的科技成果里面都有论述,别的先不说,至少紧跟时代的理论知识

  原先离散数学和数据结构归在一起成为离散数学结构,后来由于数据结构的内容比较多,分出来了,不过最近国外好像有些大学又把它们合并到了一起,道理当然不用说,可能还是考虑到交叉的部分比较多。比较经典的书我看过得应算是《Discrete Mathematical Structures》了,清华大学出版社有个影印版的。

[4]续谈其他的一些计算数学

组合数学我看的第一本好像是北大捐给我们学院的,一本外版书。感觉没有太适合的国产书。还是读GrahamKnuth等人合著的经典"具体数学"吧,西安电子科技大学出版社有翻译版。

  《组合数学》,《空间解析几何》还有那本《拓扑学》,看这三本书的时候是极其费事的,原因有几点,首先是这三本书无一例外,都是用繁体字写的,第二就是书真得实在是太脏了,我在图书馆的座位上看,同学们都离我做得很远。我十分不自然,不愿意影响同学,但是学校不让向外借这种书(呵呵,说起这是也挺有意思,别人都不看这种书,只有我在看,老师就特别的关注我,后来我和他讲了这些书的价值,他居然把他们当作是震馆之宝,老师都不许借,不过后来他们看我真得很喜欢看,就把书借给了我,当然用的是馆长的名义借出去的。)不过收获是非常大的,再后来学习计算机理论时里面的很多东西都是常会用到的。当然如果你没看过这些书绝对理解不到那个层次。拿拓扑学来说,我们学校似乎是美开设这门课程,但是这门课程的重要性是显而易见的,没有想到的是在那本书的很多页中都夹着一些读书笔记,而那个笔记的作者及有些造诣,有些想法可以用到现代网络设计当中。

Sir的文章中提到:抽象代数,国内经典为莫宗坚先生的《代数学》。此书听说是北大数学系教材,深得好评。然而对本科生来说,此书未免太深。可以先学习一些其它的教材,然后再回头来看"代数学"。国际上的经典可就多了,GTM系列里就有一大堆。推荐一本谈不上经典,但却最简单的,最容易学的:http://www.math.miami.edu/~ec/book/这本"Introduction to Linear and Abstract Algebra"非常通俗易懂,而且把抽象代数和线性代数结合起来,对初学者来说非常理想,我校比较牛的同学都有收藏。

数论方面,国内有经典而且以理论性极强著称的潘氏兄弟著作。再追溯一点,还有更加经典(可以算世界级)并且更加困难的"数论导引"(华罗庚先生的名著,科学版,九章书店重印,繁体的看起来可能比较困难)。把基础的几章搞定一个大概,对本科生来讲足够了。但这只是初等数论。本科毕业后要学计算数论,你必须看英文的书,如Bach"Introduction to Algorithmic Number Theory"

 计算机科学理论的根本,在于算法。现在很多系里给本科生开设算法设计与分析,确实非常正确。环顾西方世界,大约没有一个三流以上计算机系不把算法作为必修的。

Sir的文章中提到:算法教材目前公认以Corman等著的《Introduction to Algorithms》为最优。对入门而言,这一本已经足够,不需要再参考其它书。

 深一点的就是大家作为常识都知道的TAOCP了。即是《The Art of Computer Programming3册内容全世界都能看下来的本身就不多,Gates曾经说过"若是你能把这书上面的东西都看懂,请把你的简历发给我一份"我的学长司徒彦南兄就曾千里迢迢从美国托人买这书回来,别的先不说,可见这书的在我们计算机科学与技术系中的分量。

Sir的文章中提到:再说说形式语言与自动机。我看过北邮的教材,应该说写的还清楚。有一本通俗易懂的好书,MITsipser的《introduction to theory of computation》。但是,有一点要强调:形式语言和自动机的作用主要在作为计算模型,而不是用来做编译。事实上,编译前端已经是死领域,没有任何open problems

北科大的班晓娟博士也曾经说过,编译的技术已相当成熟。

Sir的文章中提到:如果为了这个,我们完全没必要去学形式语言用用yacc什么的就完了。北邮的那本在国内还算比较好,但是在深度上,在跟可计算性的联系上都有较大的局限,现代感也不足。

所以建议有兴趣的同学去读英文书,中文原著的教材中比较经典的是清华大学出版社出版的《形式语言与自动机理论》,作者是北京工业大学的蒋宗礼教授。中文翻译版本一本《自动机理论、语言和计算导论》不过国内似乎没引进这方面的教材。可以去互动出版网上看一看。入门以后,把形式语言与自动机中定义的模型,和数理逻辑中用递归函数定义的模型比较一番,可以说非常有趣。现在才知道,什么叫"宫室之美,百官之富"

Sir的文章中提到:计算机科学和数学的关系有点奇怪。二三十年以前,计算机科学基本上还是数学的一个分支。而现在,计算机科学拥有广泛的研究领域和众多的研究人员,在很多方面反过来推动数学发展,从某种意义上可以说是孩子长得比妈妈还高了。但不管怎么样,这个孩子身上始终流着母亲的血液。这血液是the mathematical underpinning of computer science(计算机科学的数学基础),也就是理论计算机科学。

原来在东方大学城图书馆中曾经看过一本七十年代的译本(书皮都没了,可我就爱关注这种书),大概就叫《计算机数学》。那本书若是放在当时来讲决是一本好书,但现在看来,涵盖的范围还算广,深度则差了许多,不过推荐大一的学生倒可以看一看,至少可以使你的计算数学入入门,也就是说至少可以搞清数学到底在计算机科学什么地方使用。

Sir的文章中提到:最常和理论计算机科学放在一起的一个词是什么?答:离散数学。这两者的关系是如此密切,以至于它们在不少场合下成为同义词。(这一点在前面的那本书中也有体现)传统上,数学是以分析为中心的。数学系的同学要学习三四个学期的数学分析,然后是复变函数,实变函数,泛函数等等。实变和泛函被很多人认为是现代数学的入门。在物理,化学,工程上应用的,也以分析为主。

随着计算机科学的出现,一些以前不太受到重视的数学分支突然重要起来。人们发现,这些分支处理的数学对象与传统的分析有明显的区别:分析研究的问题解决方案是连续的,因而微分,积分成为基本的运算;而这些分支研究的对象是离散的,因而很少有机会进行此类的计算。人们从而称这些分支为"离散数学""离散数学"的名字越来越响亮,最后导致以分析为中心的传统数学分支被相对称为"连续数学"

离散数学经过几十年发展,基本上稳定下来。一般认为,离散数学包含以下学科:

1)集合论,数理逻辑与元数学。这是整个数学的基础,也是计算机科学的基础。

2)图论,算法图论;组合数学,组合算法。计算机科学,尤其是理论计算机科学的核心是算法,而大量的算法建立在图和组合的基础上。

3)抽象代数。代数是无所不在的,本来在数学中就非常重要。在计算机科学中,人们惊讶地发现代数竟然有如此之多的应用。但是,理论计算机科学仅仅就是在数学的上面加上"离散"的帽子这么简单吗?一直到大约十几年前,终于有一位大师告诉我们:不是。D.E.Knuth(他有多伟大,我想不用我再说了)Stanford开设了一门全新的课程Concrete Mathematics

Concrete这个词在这里有两层含义:

首先:对abstract而言。Knuth认为,传统数学研究的对象过于抽象,导致对具体的问题关心不够。他抱怨说,在研究中他需要的数学往往并不存在,所以他只能自己去创造一些数学。为了直接面向应用的需要,他要提倡"具体"的数学。在这里我做一点简单的解释。例如在集合论中,数学家关心的都是最根本的问题--公理系统的各种性质之类。而一些具体集合的性质,各种常见集合,关系,映射都是什么样的,数学家觉得并不重要。然而,在计算机科学中应用的,恰恰就是这些具体的东西。Knuth能够首先看到这一点,不愧为当世计算机第一人。其次,ConcreteContinuous(连续)加上discrete(离散)。不管连续数学还是离散数学,只要是能与我们研究的内容挂上钩的都是有用的数学!

2、理论与实际的结合--计算机科学技术研究的范畴与学习方法

 前面主要是从数学角度来看的。从计算机角度来看,理论计算机科学目前主要的研究领域包括:可计算性理论,算法设计与复杂性分析,密码学与信息安全,分布式计算理论,并行计算理论,网络理论,生物信息计算,计算几何学,程序语言理论等等。这些领域互相交叉,而且新的课题在不断提出,所以很难理出一个头绪来。想搞搞这方面的工作,推荐看中国计算机学会的一系列书籍,至少代表了我国的权威。下面随便举一些例子。

Sir的文章中提到:由于应用需求的推动,密码学现在成为研究的热点。密码学建立在数论(尤其是计算数论),代数,信息论,概率论和随机过程的基础上,有时也用到图论和组合学等。很多人以为密码学就是加密解密,而加密就是用一个函数把数据打乱。这样的理解太浅显了。

现代密码学至少包含以下层次的内容:

第一,密码学的基础。例如,分解一个大数真的很困难吗?能否有一般的工具证明协议正确?

第二,密码学的基本课题。例如,比以前更好的单向函数,签名协议等。

第三,密码学的高级问题。例如,零知识证明的长度,秘密分享的方法。

第四,密码学的新应用。例如,数字现金,叛徒追踪等。

密码学方面值得推荐的有一本《应用密码学》还有就是平时多看看年会的论文集,感觉这种材料实用性比较强,会提高很快。

 Sir的文章中提到:在分布式系统中,也有很多重要的理论问题。例如,进程之间的同步,互斥协议。一个经典的结果是:在通信信道不可靠时,没有确定型算法能实现进程间协同。所以,改进TCP三次握手几乎没有意义。例如时序问题。常用的一种序是因果序,但因果序直到不久前才有一个理论上的结果....例如,死锁没有实用的方法能完美地对付。例如......

  如果计算机只有理论,那么它不过是数学的一个分支,而不成为一门独立的科学。事实上,在理论之外,计算机科学还有更广阔的天空。
我一直认为,4年根本不够学习计算机的基础知识,因为面太宽了,要是真学的话,我想至少8年的学习能使你具有一定的科学素养......
  这方面我想先说说我们系在各校普遍开设的《计算机基础》。在高等学校开设《计算机基础课程》是我国高教司明文规定的各专业必修课程要求。主要内容是使学生初步掌握计算机的发展历史,学会简单的使用操作系统,文字处理,表格处理功能和初步的网络应用功能。但是在计算机科学系教授此门课程的目标决不能与此一致。在计算机系课程中目标应是:让学生较为全面的了解计算机学科的发展,清晰的把握计算机学科研究的方向,发展的前沿即每一个课程在整个学科体系中所处的地位。搞清各学科的学习目的,学习内容,应用领域。使学生在学科学习初期就对整个学科有一个整体的认识,以做到在今后的学习中清楚要学什么,怎么学。计算机基本应用技能的位置应当放在第二位或更靠后,因为这一点对于本系的学生应当有这个摸索能力。这一点很重要。推荐给大家一本书:机械工业出版社的《计算机文化(New Perspective of Computer Science),看了这本书我才深刻的体会到自己还是个计算机科学初学者,才比较透彻的了解了什么是计算机科学。科学出版社的《计算科学导论 (赵致琢先生的著作)可以说是在高校计算机教育改革上作了很多的尝试,也是这方面我受益很大的一本书。

一个一流计算机系的优秀学生决不该仅仅是一个编程高手,但他一定首先是一个编程高手。我上大学的时候,第一门专业课是C语言程序设计,念计算机的人从某种角度讲相当一部分人是靠写程序吃饭的。在我们北京工业大学计算机系里一直有这样的争论(时至今日CSDN上也有),关于第一程序设计语言该用哪一种。我个人认为,用哪种语言属于末节,关键在养成良好的编程习惯。当年老师对我们说,打好基础后学一门新语言只要一个星期。现在我觉得根本不用一个星期,前提是先把基础打好。不要再犹豫了,学了再说,等你抉择好了,别人已经会了几门语言了。

[1]专谈计算机系统的学习

Sir的文章中提到:汇编语言和微机原理是两门特烦人的课。你的数学/理论基础再好,也占不到什么便宜。这两门课之间的次序也好比先有鸡还是先有蛋,无论你先学哪门,都会牵扯另一门课里的东西。所以,只能静下来慢慢琢磨。这就是典型的工程课,不需要太多的聪明和顿悟,却需要水滴石穿的渐悟。有关这两门课的书,计算机书店里不难找到。弄几本最新的,对照着看吧。

组成原理推荐《计算机组成与结构》清华大学王爱英教授写的。汇编语言大家拿8086/8088入个门,之后一定要学80x86汇编语言。实用价值大,不落后,结构又好,写写高效病毒,高级语言里嵌一点汇编,进行底层开发,总也离不开他,推荐清华大学沈美明的《IBM-PC汇编语言程序设计》。有些人说不想了解计算机体系结构,也不想制造计算机,所以诸如计算机原理,汇编语言,接口之类的课觉得没必要学,这样合理吗?显然不合理,这些东西迟早得掌握,肯定得接触,而且,这是计算机专业与其他专业学生相比的少有的几项优势。做项目的时候,了解这些是非常重要的,不可能说,仅仅为了技术而技术,只懂技术的人最多做一个编码工人,而永远不可能全面地了解整个系统的设计,而编码工人是越老越不值钱。关于组成原理还有个讲授的问题,在我学这门课程时老师讲授时把CPU工作原理誉微程序设计这一块略掉了,理由是我们国家搞CPU技术不如别的国家,搞了这么长时间好不容易出了个龙芯比Intel的还差个十万八千里,所以建议我们不要学了。我看这在各校也未见得不是个问题吧!若真是如他所说,那中国的计算机科学哪个方向都可以停了,软硬件,应用,有几项搞得过美国,搞不过别人就不搞了,那我们坐在这里干什么?教学的观念需要转变的。我们学校现在有一个学弟就专攻CPU设计,平时交流不少,发现他能够将软件的设计思想应用到芯片设计上,我看真的是不错的,比起那些望而生畏的恐怕要强上百倍。

Sir的文章中提到:模拟电路这个学科,如今不仅计算机系学生搞不定,电子系学生也多半害怕。如果你真想软硬件通吃,那么建议你先看看邱关源的"电路原理",也许此后再看模拟电路底气会足些。教材:康华光的"电子技术基础"(高等教育出版社)还是不错的

(我校电子系在用)。有兴趣也可以参考童诗白的书。

数字电路比模拟电路要好懂得多。推荐大家看一看北京工业大学刘英娴教授写的《数字逻辑》。业绩人士都说这本书很有参考价值 (机械工业出版社)。原因很明了,实用价值高,能听听她讲授的课程更是有一种"享受科学"的感觉。清华大学阎石的书也算一本好教材,遗憾的一点是集成电路讲少了些。真有兴趣,看一看大规模数字系统设计吧(北航那本用的还比较多)

Sir的文章中提到:计算机系统结构该怎么教,国际上还在争论。国内能找到的较好教材为Stallings的《Computer Organization and Architecture:Designing for Performance(清华影印本)。国际上最流行的则是《Computer architecture: aquantitative approachby Patterson & Hennessy

[2]一些其他的专业课程

Sir的文章中提到:操作系统可以选用《操作系统的内核设计与实现》和《现代操作系统》两书之一。

这两部都可以算经典。我们当时理论方面学习采用的是清华大学出版社《操作系统》,张尧学教授写的那本。可以说理论涉及的比较全,在有就是他的实验指导书,操作系统这门学科同程序设计结合得很紧密,不自己试着做些什么恐怕很难搞通。我想作为实践类的参考首推的是这本:《4.4BSD操作系统设计与实现》作为开源文化很重要的一个分支的BSD操作系统家族做得非常出色,其中现在若干出色的分支系统(例如FreeBSD,NetBSD,OpenBSD,DragonflyBSD)都与4.4BSD有着难解的渊源。而4.4BSD的开发者亲自撰写的这本理论设计与实现便是一本绝佳的参考。另外在有一些辅助材料的基础上研究*nix的源代码也是深入操作系统设计与实现的一条绝佳之路。(感谢CSDN网友ffgg的建议,我将《Windows操作系统原理》这本书去掉,现在看来这本书的确不能算是一个十分优秀的作品)

Sir的文章中提到:如果先把形式语言学好了,则编译原理中的前端我看只要学四个算法:最容易实现的递归下降;最好的自顶向下算法LL(k);最好的自底向上算法LR(k)LR(1)的简化SLR(也许还有另一简化LALR)。后端完全属于工程性质,自然又是another story

推荐教材:Kenneth C.Louden写的《Compiler Construction Principles and Practice》即是《编译原理及实践(机械工业出版社的译本)

Sir的文章中提到:学数据库要提醒大家的是,会用VFPVB, Power builder不等于懂数据库。(这世界上自以为懂数据库的人太多了!)数据库设计既是科学又是艺术,数据库实现则是典型的工程。所以从某种意义上讲,数据库是最典型的一门计算机课程理工结合,互相渗透。

另外推荐大家学完软件工程学后再翻过来看看数据库技术,又会是一番新感觉。至少对一些基本概念与描述方法会有很深的体会,比如说数据字典,E-R图之类的。推荐教材:Abraham Silberschatz等著的 "Database System Concepts".作为知识的完整性,还推荐大家看一看机械工业出版社的《数据仓库》译本。

Sir的文章中提到:计算机网络的标准教材还是来自Tanenbaum的《Computer Networks(清华大学有译本)。还有就是推荐谢希仁的《计算机网络教程(人民邮电出版社)问题讲得比较清楚,参考文献也比较权威。不过,网络也属于Hardcore System,所以光看书是不够的。建议多读RFC

http://www.ietf.org/rfc.html里可以按编号下载RFC文档。从IP的读起。等到能掌握10种左右常用协议,就没有几个人敢小看你了。再做的工作我看放在网络设计上就比较好了。

数据结构的重要性就不言而喻了,学完数据结构你会对你的编程思想进行一番革命性的洗礼,会对如何建立一个合理高效的算法有一个清楚的认识。对于算法的建立我想大家应当注意以下几点:

当遇到一个算法问题时,首先要知道自己以前有没有处理过这种问题.如果见过,那么你一般会顺利地做出来;如果没见过,那么考虑以下问题:

1. 问题是否是建立在某种已知的熟悉的数据结构(例如,二叉树)?如果不是,则要自己设计数据结构。

2. 问题所要求编写的算法属于以下哪种类型?(建立数据结构,修改数据结构,遍历,查找,排序...)

3. 分析问题所要求编写的算法的数学性质.是否具备递归特征?(对于递归程序设计,只要设计出合理的参数表以及递归结束的条件,则基本上大功告成.)

4. 继续分析问题的数学本质.根据你以前的编程经验,设想一种可能是可行的解决办法,并证明这种解决办法的正确性.如果题目对算法有时空方面的要求,证明你的设想满足其要求.一般的,时间效率和空间效率难以兼得.有时必须通过建立辅助存储的方法来节省时间.

5. 通过一段时间的分析,你对解决这个问题已经有了自己的一些思路.或者说,你已经可以用自然语言把你的算法简单描述出来.继续验证其正确性,努力发现其中的错误并找出解决办法.在必要的时候(发现了无法解决的矛盾),推翻自己的思路,从头开始构思.

6. 确认你的思路可行以后,开始编写程序.在编写代码的过程中,尽可能把各种问题考虑得详细,周密.程序应该具有良好的结构,并且在关键的地方配有注释.

7. 举一个例子,然后在纸上用笔执行你的程序,进一步验证其正确性.当遇到与你的设想不符的情况时,分析问题产生的原因是编程方面的问题还是算法思想本身有问题.

8. 如果程序通过了上述正确性验证,那么在将其进一步优化或简化。

9. 撰写思路分析,注释.

对于具体的算法思路,只能靠你自己通过自己的知识和经验来加以获得,没有什么特定的规律(否则程序员全部可以下岗了,用机器自动生成代码就可以了).要有丰富的想象力,就是说当一条路走不通时,不要钻牛角尖,要敢于推翻自己的想法.我也只不过是初学者,说出上面的一些经验,仅供大家参考和讨论。

关于人工智能,我觉得的也是非常值得大家仔细研究的,虽然不能算是刚刚兴起的学科了,但是绝对是非常有发展前途的一门学科。我国人工智能创始人之一,北京科技大学涂序彦教授(这老先生是我的导师李小坚博士的导师)对人工智能这样定义:人工智能是模仿、延伸和扩展人与自然的智能的技术科学。在美国人工智能官方教育网站上对人工智能作了如下定义:Artificial Intelligence, or AI for short, is a combination of computer science, physiology, and philosophy. AI is a broad topic, consisting of different fields, from machine vision to expert systems. The element that the fields of AI have in common is the creation of machines that can "think".

这门学科研究的问题大概说有:

(1)符号主义: 符号计算与程序设计基础,知识表达方法 :知识与思维,产生式规则,语义网络,一阶谓词逻辑问题求解方法:搜索策略,启发式搜寻,搜寻算法,问题规约方法,谓词演算:归结原理,归结过程专家系统:建立专家系统的方法及工具

(2)联接主义(神经网络学派)1988年美国权威机构指出:数据库,网络发展呈直线上升,神经网络可能是解决人工智能的唯一途径。关于神经网络学派,现在很多还是在发展阶段。

我想对于人工智能的学习,大家一定不要像学数学似的及一些现成的结论,要学会分析问题,最好能利用程序设计实现,这里推荐给大家ACM最佳博士论文奖获得者涂晓媛博士的著作《人工鱼-计算机动画的人工生命方法》(清华大学出版社)。搞人工生命的同学不会不知道国际知名的涂氏父女吧。关于人工智能的书当然首选《Artificial Intelligence A New SynthesisNils J.Nilsson.鼻祖嘛!

关于网络安全我也想在这里说两句,随着计算机技术的发展,整个社会的信息化水平突飞猛进,计算机网络技术日新月异,网络成了当即社会各个工作领域不可缺少的组成部分,只要有网络存在,网络安全问题就是一个必须解决好的问题,学习网络安全不是简简单单的收集一些黑客工具黑一黑别人的网站,而是要学习他的数学原理,实现原理,搞清底层工作机制,这样才能解决大部分的现有问题和新出现的安全问题。 总的来说信息安全学的研究还是非常深奥的,这方面体会比较深的要算是在最近的微软杯程序设计大赛中利用.NET平台开发的那个项目My E-business Fairy.NET过程中了。

[3]闲聊软件工程

关于计算机科学的一些边缘科学我想谈一谈软件工程技术,对于一个企业,推出软件是不是就是几个程序员坐在一起,你写一段程序,我写一段程序呢?显然不是。软件工程是典型的计算机科学和数学,管理科学,心理学,社会学等学科的综合。它使我们这些搞理论和技术的人进入了一个社会。你所要考虑的不仅仅是程序的优劣,更应该考虑程序与软件的区别,软件与软件产品的区别,软件软件产品的市场前景,如何去更好的与人交流。这方面我还在学习阶段,以后这方面再写文章吧,先推荐给大家几本书:畅销20年不衰的《人月神话(清华大学中文版,中国电力出版社影印版),《软件工程-实践者研究的方法》(机械工业出版社译本),《人件(据说每一位微软公司的部门经理都读过这本书,推荐老总们和想当老总的同学都看看,了解一下什么是软件企业中的人)以及微软公司的《软件开发的科学与艺术》和《软件企业的管理与文化(研究软件企业的制胜之道当然要研究微软的成功经验了!) 看完上面的书,结合自己做的一些团队项目,我的一些比较深的体会有这么几点

1How important a plan is for a project development.

2How to communicate with your team members in a more effective way.

3How to solve unexpected situations.

4The importance of unification.

5The importance of doing what you should do.

6The importance of designing before programming.

7The importance of management.

8The importance of thinking what your teammates think.

在软件开发过程中我们应当具有以下能力:

1.Like it if you would like to do it.

We believe that your attitude toward your work will definitely makes great effect on the project.

2.The spirit of group working.

Take myself as an example. I am just a part of the team, just a little part. You must make it clear that you are just a member of the team, but your effort will change your project a lot.

3.Passion

With passion, you can do your job in a more effective way.

4.The ability of solving unexpected problems.

5.Learning New things in a very short time

It is the basic requirement for we computer major to learn new technology.

6.Creativity

The tools are changing. As for us, what's more important is to use these new tools and technology to enable people and businesses throughout the world to realize their full potential.

7.The ability to do your work independently.

Every member has his own business. In a team, your work cannot be replaced by others' so you must do your business well in order to assure the project development process.

团队开发当中的一些具体精神应当有:

<1> Success and Failure is not one person's effect.

Your team's success is not the contribution of a single person. Success contributes to the whole team. If your project failed, it also is not just because of one person's poor work. It is also your failure.

<2> Learn from each other.

Every person has his own specialty. Even Bill Gates cannot know all the things about software development. We often learn from each other and gains a lot. The old saying goes like this:

There must be one out of three who can be your teacher. In our team we say: Every person is your teacher.

<3> Help those who have problems. Use the group working spirit to overcome all the difficulties.

There is no need to explain it. As the old saying: Two heads are better than one. We always find it difficult to solve all the problems just by oneself.

<4> Praise them who have got some improvement.

In our team, I always praise the members when they have finished something or just solved one problem, and they think that it is interesting and gains a lot. Because they can see their efforts.

<5> Say something if needed.

这个是一次软件大赛当中的体会,和大家也做个交流,不过不能再说了,软件工程学说起来写本2000页的书一点也不多,恕我才疏学浅,不再做过多论述了。

[4]谈谈学习态度的问题

关于计算机技术的学习我想是这样的:学校开设的任何一门科学都有其滞后性,不要总认为自己掌握的某门技术就已经是天下无敌手了,虽然现在Java,VB,C,C++用的都很多,怎能保证没有被淘汰的一天,我想.NET平台的诞生和X#语言的初见端倪完全可以说明问题。换言之,在我们掌握一门新技术的同时就又有更新的技术产生,身为当代的大学生应当有紧跟科学发展的素质。举个例子,就像有些同学总说,我做网页设计就喜欢直接写html,不愿意用什么Frontpage,Dreamweaver。能用语言写网页固然很好,但有高效的手段你为什么不使呢?仅仅是为了显示自己的水平高,unique? 我看真正水平高的是能够以最快的速度接受新事物的人。高级程序设计语言的发展日新月异,今后的程序设计就像人们在说话一样,我想大家从xml中应是有所体会了。难道我们真就写个什么都要用汇编,以显示自己的水平高,真是这样倒不如直接用机器语言写算了。反过来说,想要以最快的速度接受并利用新技术关键还是在于你对计算机科学地把握程度。当然有一点我们必须指出,就是对于新技术要辩证得看,不能盲从。

计算机技术牵扯的内容更为广泛些,一项一项说恐怕没个一年半载也说不清。我只想提醒大家的还是那句话,技术与科学是不能分家的,学好了科学同时搞技术,这才是上上策。犹如英语,原先人们与老外交流必须要个翻译,现在满马路的人都会说英语。就连21世纪英语演讲比赛的冠军都轮不到英语系的学生了。计算机也是一样的,我们必须面对的一个现实就是:计算机真就只是一个工具,如果不具备其它方面的素养,计算机系的学生虽然不能说找不到工作,不过总有一天当其他专业性人才掌握了计算机技术后将比我们出色许多。原因就在于计算机解决的大都是实际问题,实际问题的知识却是我们少有的。单一的计算机技术没有立足之地。

我想是时候指出:学习每一个课程之前,都要先搞清这一课程的学习目的。这一学科的应用领域。据我自身所了解到的同龄同学和低年级的同学的学习状况:他们之中很少有人知道学一个学科的学习目的,期末考试结束了也不知道学这科做什么用。这就失去了读计算机科学的意义。当然这与现存的教育思想不能说一点关系都没有。

总的来说,从教育角度来讲,国内高校的课程安排不是很合理,强调理论,又不愿意在理论上深入教育,无力接受新技术,想避开新技术又无法避得一干二净。我觉得关键问题就是国内的高校难于突破现状,条条框框限制着怎么求发展。我们虽然认识得到国外教育的优越性,但为什么迟迟不能采取行动?哪怕是去粗取精的取那么一点点。我们需要改变。从我们自身角度来讲,多数人4年下来既没有学习计算机科学的学术水平,也没有学习计算机技术的那种韧劲。在我刚上大一时,我的计算机科学入门导师,淮北煤炭师范学院王爱平教授曾经对我说过这样一番话:"当你选择了计算机这一门科学,就意味着你踏上了一条不归路,就意味着你一生都要为之奋斗……你的身后是悬崖,只有向前走,不能往后退。"

有些同学说按照这样学习学的东西太多,有的未见得有用,我想打个形象的比方:学校学出来的人都是一个球体,方方面面的知识都应具备。可是社会上需要球体的地方很少,反而需要的是砖和瓦,即精通某一行的人才。但是对于同等体积的物体,用球体来改造是最方便最省事的。学校的学生很多,为了能够使更多的学生来适应这个社会,学校也就不得以把所有的学生都打造成一个球体,然后让社会对这些学生进行再加工,成为真正能够有用的人才。即使你非常清楚自己的将来要干什么,并且非常下定决心要走自己的路,这一步你也必须走,世界是在不断变化的,你不能预料未来。想清楚,努力去干吧!

计算机科学博大精深,我只是个初学者。前面的路还长,计算机科学需要我们为之奋斗......学习计算机科学需要韧性,更需要创新,需要激情。深刻学习理论知识,勇于接受新技术的挑战,这才是我们这一代人应具有的素质。最后送大家一句话"Wake up every day with a feeling of passion for the difference technology will make in people's life!"

 

src="" type="text/javascript">


 
苏老师 @ 2008-10-24 23:55

饮水思源 - AI精华区文章阅读
发信人: arealme (蓝宝石之谜), 信区: AI
标  题: 如何向国际刊物投稿--转载
发信站: 饮水思源站 (Sat Jul 14 18:46:15 2001), 转信

发信人: daniel (飞翔鸟), 信区: AI
标  题: Re: 斑竹点题
发信站: 南京大学小百合站 (Wed Oct 13 14:10:09 1999), 站内信件

【 在 gaoy (阿菠萝) 的大作中提到: 】
: 请Daniel报告投国外杂志的步骤和经验。
: //applaud

呵呵,首先嘛,挑一个合适的刊物,你的东东水平不要和那刊物上的文章差距太大,
比如说,如果让俺投AI、Machine Learning这样的顶级刊物,绝对没有“生还”的
希望。

第二,英语要写得好。一般有三个标准,English, Organization和Readability,
只要有一个是poor就歇。这可以通过多看经典文章来提高。

第三,要有很新的东西。稍微一点点对别人的改进绝对没戏。这就是journal paper
和conference paper的区别。journal paper是很难的,国外的researcher也主要是
conference paper多,journal paper也就那么几篇。往往是出了3、4篇conference
paper之后,合起来写一篇大文章投journal。所以,很多journal paper都是几十页,
甚至有上百页的。其引用率当然很高了。

第四,要做一个好的survey。要把当前国外所有与你有关的工作都理出来(至少80%),
并简单评述一下,尤其是指出你与别人的区别和优势。通常这是放在related works里。

第五,观点、理论叙述清晰。国外journal的审稿人通常是很牛的人,而且肯定是搞
你的领域的senior expert。这和国内审稿可以蒙混过关差别极大。有的审稿人甚至
会在你的文章后面列一个几十篇的paper list,要求你看完再“发话”。所以,不光
要有突破性的东西,还要有相当insight的看法和分析。

第六,实验数据翔实可靠。这一点一定要做好。投journal paper,基本上有三分之
一的篇幅是在描述实验和比较。凡是目前popular的东西,或者是有代表性的东西,你
都要做实验进行比较。实验数据也不能是你自己造的,那没有说服力。目前各领域
基本上都有些benchmark data,可以从网上下载的。实验分析要清楚,线性图、直方
图、圆饼图之类的该有一定要有。实验中用到的机器、算法参数等等一定要交代清楚。

呵呵,如果以上做得比较好,就可以试试投journal了。不过,在此之前可以先试着
投投conference以增长经验值。

以上讨论仅限于AI领域的刊物。


--
迷失在都市的旷野
享受孤独的梦想
体会寂寞的光荣
  
--
如果我有一千万,我就买一栋房子;
如果我有翅膀,我就飞;
如果我有女朋友,我就不当板主.

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 211.80.39.137]

[返回上一页] [本讨论区]


 
苏老师 @ 2008-10-24 23:55

如何阅读paper (zz)
发信站: 饮水思源 (2002年12月14日14:20:46 星期六), 站内信件

发信人: cloud (榆木脑袋), 信区: AI
标  题: 如何阅读paper
发信站: 南京大学小百合站 (Thu May 16 11:41:03 2002), 站内信件

做学问的最大功课就是读paper. 从浩如烟海的文献里面找出自己有用的东西.
这并不是一件容易的工作. 有些人做得非常出色,比如daniel 还有我们研究院
的许多同事.
而我自己走过了多年的弯路. 最终也领悟到了读paper的方法,但为时已晚. 很多
光阴已经虚掷,无从追回. 这里特此,将我所有的体会罗列如下,希望大家指正.

1. 入门宜缓
在选择研究方向的时候,还是要三思而行. 多读这方面的survey, review 和tutorial
之类的文章. 弄清楚这个方面目前研究的状况,是已经比较成熟了呢,还是刚刚兴起.
建议大家还是做新兴的东西比较好, 出文章和成果容易

2. 常看引文
引文是非常重要的东西, 经常留意引文. 可以发现这个领域谁做得比较好, 权威是哪些.

哪些工作是里程性的. 这样可以使得你在以后选择阅读方向的时候少走弯路

3. 浏览能力
要养成审稿人的习惯. 拿到文章,先看标题, 作者单位, 然后是摘要和引文, 最后是结
束语. 争取在几分钟内决定什么文章该读,什么不该读.


4.多做笔记
这是少做重复劳动的好方法, 好些文章读过就忘. 需要的时候没有笔记,就只好做重复劳

动了

5.经常整理
一段时间的研究下来. 堆积的文章很快就会有一大堆. 有一天自己写论文时, 想引用的
时候,突然发现已经记不起这个观点是谁提出的了. 而这时,你往往会沮丧的发现,你想要

引用的paper, 在那一大堆文件中很难被找出来. 因此单独将你认为比较有价值的文章
整理出来,是比较好的主意. 当然能够自己为阅读过的文章做个主页是个更好的办法.
整理的内容包括: 论文的标题, 作者, 出处, 发表时间, 你自己的摘要

6.多做交流
paper是很难一个人读完的. 有共同兴趣的人,应该常常交流. 每几周一次的paper
reading聚会是个非常好的办法.


 
苏老师 @ 2008-10-24 23:18

麦卡锡 - 简介

麦卡锡 1927年9月4日麦卡锡(John McCarthy)生于美国波士顿一个共产党家庭,父母的工作性质决定全家需不断搬迁,从波士顿迁到纽约,然后又到了洛杉矶。信仰爱尔兰天主教的父亲当过木匠、渔夫和工会组织者,母亲是立陶宛犹太人,在联合通讯社(TheFederatedPress)当记者,后来在一家共产党报社工作。麦卡锡从小把自己对科学的兴趣与家庭的政治倾向结合起来。麦卡锡在接受采访时说:“我们确信技术的进步对人类有利。我记得小时候读过《十万个为什么》,这是30年代苏联作家伊林(M.Ilin)撰写的通俗科技读物。在美国好像没有这样的书。10至15年前我很高兴得知中国有许多非常早熟的儿童,他们都读过《十万个为什么》。”
麦卡锡说他的童年平平淡淡,实际上在读中学时,他就找到加州理工大学的一份课程清单,自学了大学一年和二年的数学课程。1944年他真的到了这所大学,免修头两年的数学课。1948年9月在读研究生时,他出席了该校主办的“行为的大脑机制西克森研讨会”(Hixon Symposiumon Cerebral Mechanism in Behavior at CalTech)。大数学家、计算机设计大师冯·诺伊曼在会上散发了关于自复制自动机的论文。尽管当时还没有人精确地将机器智能与人的智能联系起来,但诺伊曼的报告却激发了麦卡锡的好奇心。1949年在普林斯顿大学数学系作博士论文时,他决定尝试在机器上模拟人的智能。1955年他联合申农信息论创立者)、明斯基(人工智能大师,《心智社会》的作者)、罗彻斯特(IBM计算机设计者之一),发起了达特茅斯项目(Dartmouth Project),第二年正式启动,洛克菲勒基金会提供了极有限的资助。现在看来,这个项目不但是人工智能发展史的一个重要事件,也是计算机科学的一个里程碑。正是在1956年,麦卡锡首次提出“人工智能”(artificial intelligence)这一概念。现在看来,那次讨论并没有实质上解决有关智能机的任何具体问题,但它确立了研究目标,使人工智能成为计算机科学中一门独立的经验科学
1957年巴库斯(John Barkus)及其IBM小组发布了Fortran语言,这是第一个成功的高级语言,使程序设计者从繁琐的汇编语言中解脱出来。卡内基梅龙大学的纽维尔(A.Newell)、司马赫(H.Simon)等提出信息处理语言IPL,麦卡锡则提出表处理语言Lisp。在Fortran中不允许有递归,麦卡锡希望改进它。1960年巴黎会议大家讨论了Algol语言,采纳了麦卡锡的建议,增加了递归和条件表达式。Algol最早接受了Lisp的观念,但不是最后一个。如今的Pascal、C、Ada等都接受了Lisp的创新。但至今,主流程序设计语言仍然没有吸收麦卡锡建议的“评价函数”(eval),认为它很危险。麦卡锡发明Lisp语言,只是把它作为工具,他的目标是制造具有人类智能的机器。Lisp自发明以后,像其他语言一样,发明人失去了对其的控制能力,马库斯和凯(A.Kay,“面向对象程序设计”的创始人)也一样。

1959年麦卡锡发表《具有常识的程序》一文,标志着他向“常识逻辑推理”难题开始宣战。“与所有专门化的理论一样,所有科学也都体现于常识中。当你试图证明这些理论时,你就回到了常识推理,因为常识指导着你的实验。”设想一个旅行者从英国格拉斯哥经过伦敦莫斯科,计算机程序可以分段处理:从格拉斯哥到伦敦,再从伦敦到莫斯科。但是如果假设此人不幸在伦敦丢失了机票怎么办?当然现实中此人一般不会因此取消原来去莫斯科的计划,他可能会再买一张票。但是预先设计好的模拟程序却不允许如此灵活。因此要发展一种具有常识推理能力的逻辑。
1964年麦卡锡已是斯坦福大学人工智能实验室的主任,他提出了一种称之为“情景演算”(situational calculus)的理论,其中“情景”表示世界的一种状态。当主体(agent)行动时,情景发生变化。主体下一步如何行动取决于他所知道的情景。情景演算的思想吸收了有穷自动机状态转移的概念。在情景演算中,推理不但取决于状态,而且取决于主体关于状态知道些什么。主体知道得越多,了解得越详细,他就会更好地作出决策。这种情景演算理论吸引了许多研究者,但它本身也引起一种问题。在多主体的世界中,与一个主体有关的情景的变化可能还取决于其他主体的行动。这样处理起来十分困难。在常识世界中,我们的决策可能不大受其他主体的影响,当然有时也受。很难说麦卡锡的努力最终是否成功了,但他向通常的“演绎推理”挑战,强调人类智能推理的非单调性(nonmonotonicity),发展状态描述法,在人工智能研究中具有重要意义。麦卡锡试图让机器能像人一样,在某种语境下,进行基本的猜测。但这很难做,即使是人,也常常误解语境。一个有趣的例子是:白宫发言人奥涅尔欢迎新当选的里根总统时说:“您成了Grover Cleveland”(他指的是美国的一个总统)。而里根却微笑着说:“我只在电影中扮演过一次Cleveland。”(里根指的是棒球手Grover Cleveland Alexander)
不管人们对人工智能还有什么偏见,它现在已成为严肃的经验科学,而麦卡锡为这一领域培养了大量人才,他的学生遍及世界。关于人工智能,想了解更多的东西可以直接访问麦卡锡的网页,从“公众理解科学的角度”看,他的网页做得非常棒。他讨论了人工智能与哲学的关系,人工智能的分类及应用领域等。还详细回答了有关人类“可持续发展”的问题。他是技术乐观派,相信人类会有一个美好的未来(他提供了许多论据,可从网上看到)。



 
苏老师 @ 2008-10-24 23:07

总算完全明白 Situation Calculus了

总算明白Situation Calculus了, 原以为很简单的东西, 直到今天晚上才明白你的巧妙之处, 明白了以下问题:

(1) 既然可以很方便的 使用 first-order logic 进行 Knowledge representation, 为什么要提出 一个新的Situation Calculus框架.

(2) Situation Calculus 和 Knowledge Base 的本质关系

(3) 如何描述 Actions 和 Actions 导致的状态的变化和保持(通过Fluent)

(4) 为什么要有Effect Axioms 和 Frame Axioms

(5) 总算知道了为什么通过 Theorem Proving可以做Planning. 原来 planning 在这里竟然是个Byproduct.....(晕倒了。。。) 以前敲破头也没弄明白为什么Stanford 的 Sheila mcllraith 这个牛牛竟然可以不需要Planner, 简单通过Situation Calculus 就可以做Web Servcie Composition了。现在明白了,以前对你不敬,真是抱歉.......话又说回来了,他们的方案还是又很大缺陷的,这也是我做新方案的原因。如果可以在Situation Calculus的框架内加入Uncertainty......

天啊, 竟然有这样的牛人可以设计出这么巧妙的框架, 真想拿块豆腐撞死算了.

搜的  总算完全明白 Situation Calculus了

总算明白Situation Calculus了, 原以为很简单的东西, 直到今天晚上才明白你的巧妙之处, 明白了以下问题:

(1) 既然可以很方便的 使用 first-order logic 进行 Knowledge representation, 为什么要提出 一个新的Situation Calculus框架.

(2) Situation Calculus 和 Knowledge Base 的本质关系

(3) 如何描述 Actions 和 Actions 导致的状态的变化和保持(通过Fluent)

(4) 为什么要有Effect Axioms 和 Frame Axioms

(5) 总算知道了为什么通过 Theorem Proving可以做Planning. 原来 planning 在这里竟然是个Byproduct.....(晕倒了。。。) 以前敲破头也没弄明白为什么Stanford 的 Sheila mcllraith 这个牛牛竟然可以不需要Planner, 简单通过Situation Calculus 就可以做Web Servcie Composition了。现在明白了,以前对你不敬,真是抱歉.......话又说回来了,他们的方案还是又很大缺陷的,这也是我做新方案的原因。如果可以在Situation Calculus的框架内加入Uncertainty......

天啊, 竟然有这样的牛人可以设计出这么巧妙的框架, 真想拿块豆腐撞死算了.