什么阻碍了fp

38 views
Skip to first unread message

莫华枫

unread,
Nov 12, 2007, 12:34:25 AM11/12/07
to TopLanguage
诸位老大,既然fp人见人爱,又是什么阻碍了它的推广呢?
(很多人没有真正"见"到,对吧。我是"见"到了,也爱上它了。哦,我亲爱的fp... :-D)

--
反者道之动,弱者道之用
m...@seaskysh.com
longsh...@gmail.com
http://blog.csdn.net/longshanks/

pongba

unread,
Nov 12, 2007, 12:49:23 AM11/12/07
to pon...@googlegroups.com
我觉得是因为人脑思维模式的问题。
人脑的思维模式就是imperative的。对于declarative的语法需要调整以后才能适应。
这就是递归比循环难理解得多的原因。
--
刘未鹏(pongba)|C++的罗浮宫
http://blog.csdn.net/pongba
TopLanguage
http://groups.google.com/group/pongba

hayate

unread,
Nov 12, 2007, 1:55:56 AM11/12/07
to pon...@googlegroups.com
但是像什么SICP这样的书 老是强调fp的思维方式更自然......
不过我现在越发感受到递归的美妙了 就像当年学习数学归纳法一样

王磊

unread,
Nov 12, 2007, 2:13:30 AM11/12/07
to pon...@googlegroups.com
一直无法正确理解递归这一牛X的复杂算法。
偶尔会手动写一些汉诺塔,的移动顺序。。。。A-〉B ,B-〉C。。。。。

 
在07-11-12,hayate <haya...@gmail.com> 写道:

red...@gmail.com

unread,
Nov 12, 2007, 2:23:40 AM11/12/07
to pon...@googlegroups.com
递归需要脑袋同时考虑多个 context 的影响, 动态性比循环强, not brain friendly.

当然, 如果一个语言将所有东西都归结到递归上, 习惯了也就可以使用了, 脑袋还
是容易训练的.

王磊 写道:

莫华枫

unread,
Nov 12, 2007, 2:27:34 AM11/12/07
to pon...@googlegroups.com
你是说fp需要我们把脑袋训练成多核的?:-)

在07-11-12,red...@gmail.com <red...@gmail.com> 写道:

pongba

unread,
Nov 12, 2007, 2:32:14 AM11/12/07
to pon...@googlegroups.com
我觉得递归之所以难以grok,是因为当人脑去模拟递归运行的时候,需要模拟一个栈,这个栈随着递归层次的加深会出现两个问题:
1. 人脑需要保存越来越多的临时变量。大家都知道,通常人能够短期存放在脑子里面的信息是有限的,有时候为了辅助思维甚至要一边思考一边写,以免想着想着就忘掉前面的了。
2. 每层栈上的几个变量都是重名的。给人脑带来很大的混淆。都是同样的几个参数,却在不同的时间点上具有不同的值。

如果是循环,想想看会有什么不同?

red...@gmail.com

unread,
Nov 12, 2007, 2:34:51 AM11/12/07
to pon...@googlegroups.com
No, 多核的脑袋最多同时处理多个循环 :)

要将脑袋训练成为 莫比斯环 形状, 对付递归就轻而易举了.

莫华枫 写道:
你是说fp需要我们把脑袋训练成多核的?:-)

在07-11-12,red...@gmail.com <red...@gmail.com> 写道:
递 归需要脑袋同时考虑多个 context 的影响, 动态性比循环强, not brain friendly.


当然, 如果一个语言将所有东西都归结到递归上, 习惯了也就可以使用了, 脑袋还
是容易训练的.

王磊 写道:
> 一直无法正确理解递归这一牛X的复杂算法。
> 偶尔会手动写一些汉诺塔,的移动顺序。。。。A-〉B ,B-〉C。。。。。
>
>




red...@gmail.com

unread,
Nov 12, 2007, 2:40:14 AM11/12/07
to pon...@googlegroups.com
这是一种特殊的耦合形式, 耦合度其实不低.

pongba 写道:
> 我觉得递归之所以难以grok,是因为当人脑去模拟递归运行的时候,需要模拟一
> 个栈,这个栈随着递归层次的加深会出现两个问题:
> 1. 人脑需要保存越来越多的临时变量。大家都知道,通常人能够短期存放在脑
> 子里面的信息是有限的,有时候为了辅助思维甚至要一边思考一边写,以免想着
> 想着就忘掉前面的了。
> 2. 每层栈上的几个变量都是重名的。给人脑带来很大的混淆。都是同样的几个
> 参数,却在不同的时间点上具有不同的值。
>
> 如果是循环,想想看会有什么不同?
>

王磊

unread,
Nov 12, 2007, 2:40:49 AM11/12/07
to pon...@googlegroups.com
not brain friendly.这个说法不错。。我就是偶尔会想想觉得真麻烦。。。记不住那么多的层次了。
 
我宁愿它随便循环也不想他递归。
 
一个现实问题,若有A,B,C三个画面。 点A上的按钮弹出B,点B上的按钮弹出C ,点C画面的关闭按钮返回A。   这时B不显示。,你们怎么做调用顺序?如果B点C出来时校验错误,则不表示C,继续显示B画面。。。。


 
在07-11-12,red...@gmail.com <red...@gmail.com> 写道:
No, 多核的脑袋最多同时处理多个循环 :)

要将脑袋训练成为 莫比斯环 形状, 对付递归就轻而易举了.

莫华枫 写道:
你是说fp需要我们把脑袋训练成多核的?:-)

在07-11-12,red...@gmail.com < red...@gmail.com> 写道:
递归需要脑袋同时考虑多个 context 的影响, 动态性比循环强, not brain friendly.


当然, 如果一个语言将所有东西都归结到递归上, 习惯了也就可以使用了, 脑袋还
是容易训练的.

王磊 写道:
> 一直无法正确理解递归这一牛X的复杂算法。
> 偶尔会手动写一些汉诺塔,的移动顺序。。。。A-〉B ,B-〉C。。。。。
>
>




hayate

unread,
Nov 12, 2007, 2:41:43 AM11/12/07
to pon...@googlegroups.com
这恰恰是需要避免的思考方式
递归描述的是N(n+1) =F(N(n)) 你的意思是一般人容易去想n-1 n-2 .... 这一方面是没有受过专业的训练
另一方面是一种本能的怀疑和不信任感,因为人们总是难以假设N(n)是绝对正确的。
如果能克服这一点,就会好多了

pongba

unread,
Nov 12, 2007, 2:46:41 AM11/12/07
to pon...@googlegroups.com
On Nov 12, 2007 3:41 PM, hayate <haya...@gmail.com> wrote:
这恰恰是需要避免的思考方式
递归描述的是N(n+1) =F(N(n)) 你的意思是一般人容易去想n-1 n-2 .... 这一方面是没有受过专业的训练
另一方面是一种本能的怀疑和不信任感,因为人们总是难以假设N(n)是绝对正确的。
如果能克服这一点,就会好多了
Yup, that's right ;)
问题就是,常人不会一开始就这么做。以及常人为什么一开始不这么做呢?

hayate

unread,
Nov 12, 2007, 3:02:56 AM11/12/07
to pon...@googlegroups.com
嗯 所以训练是必要的
这样来看 也许是件无可奈何的事情 又要不吃草又要跑得快。

SpitFire

unread,
Nov 12, 2007, 3:21:44 AM11/12/07
to pon...@googlegroups.com
我现在倒是觉得递归非常自然,想算法的时候,首先想的就是这是个递归么

在07-11-12,hayate <haya...@gmail.com> 写道:
--
SpitFire

heave...@gmail.com

unread,
Nov 12, 2007, 5:45:48 AM11/12/07
to TopLanguage
递归算是计算机理论最基础的东西了,

没有当初一班子数学牛人在那里研究递归,

就没计算机这玩意儿了。

老祖宗图灵机就是递归的。

可以在维基百科上看看

图灵可计算 : Computable function

μ递归:μ-recursive

原始递归: primitive recursive

////////////////////////////////////////////////


On 11月12日, 上午9时21分, SpitFire <spitfi...@gmail.com> wrote:
> 我现在倒是觉得递归非常自然,想算法的时候,首先想的就是这是个递归么
>

> 在07-11-12,hayate <hayate...@gmail.com> 写道:


>
>
>
>
>
> > 嗯 所以训练是必要的
> > 这样来看 也许是件无可奈何的事情 又要不吃草又要跑得快。
>
> > On Nov 12, 2007 3:46 PM, pongba <pon...@gmail.com> wrote:
>

> > > On Nov 12, 2007 3:41 PM, hayate <hayate...@gmail.com> wrote:
> > > > 这恰恰是需要避免的思考方式
> > > > 递归描述的是N(n+1) =F(N(n)) 你的意思是一般人容易去想n-1 n-2 .... 这一方面是没有受过专业的训练
> > > > 另一方面是一种本能的怀疑和不信任感,因为人们总是难以假设N(n)是绝对正确的。
> > > > 如果能克服这一点,就会好多了
>
> > > Yup, that's right ;)
> > > 问题就是,常人不会一开始就这么做。以及常人为什么一开始不这么做呢?
>
> > > > On Nov 12, 2007 3:32 PM, pongba < pon...@gmail.com> wrote:
> > > > > 我觉得递归之所以难以grok,是因为当人脑去模拟递归运行的时候,需要模拟一个栈,这个栈随着递归层次的加深会出现两个问题:
> > > > > 1.
>
> > 人脑需要保存越来越多的临时变量。大家都知道,通常人能够短期存放在脑子里面的信息是有限的,有时候为了辅助思维甚至要一边思考一边写,以免想着想着就忘掉前面的了。
> > > > > 2. 每层栈上的几个变量都是重名的。给人脑带来很大的混淆。都是同样的几个参数,却在不同的时间点上具有不同的值。
>
> > > > > 如果是循环,想想看会有什么不同?
>

> > > > > On Nov 12, 2007 3:27 PM, 莫华枫 <longshank...@gmail.com> wrote:
> > > > > > 你是说fp需要我们把脑袋训练成多核的?:-)
>
> > > > > > 在07-11-12,red...@gmail.com < red...@gmail.com> 写道:
>
> > > > > > > 递归需要脑袋同时考虑多个 context 的影响, 动态性比循环强, not brain friendly.
>
> > > > > > > 当然, 如果一个语言将所有东西都归结到递归上, 习惯了也就可以使用了, 脑袋还
> > > > > > > 是容易训练的.
>
> > > > > > > 王磊 写道:
> > > > > > > > 一直无法正确理解递归这一牛X的复杂算法。
> > > > > > > > 偶尔会手动写一些汉诺塔,的移动顺序。。。。A-〉B ,B-〉C。。。。。
>
> > > > > > --
>
> > > > > > 反者道之动,弱者道之用
> > > > > > m...@seaskysh.com

> > > > > > longshank...@gmail.com

CAXSOFT

unread,
Nov 12, 2007, 6:22:28 AM11/12/07
to pon...@googlegroups.com

fp是什么?



--
开源AnyCAD.Demo源码下载
http://bbs.caxsoft.com
OpenCASCADE+VTK+wxWidgets+C++

Googol Lee

unread,
Nov 12, 2007, 7:27:07 AM11/12/07
to TopLanguage
我也觉得递归表述更自然,而且想起来比循环更轻松。循环总要考虑当前的一堆状态都是什么,然后会变成什么,最后还要考虑些边边角角的特殊情况。递归只要
把终态和中间态考虑好就行了。

On Nov 12, 4:21 pm, SpitFire <spitfi...@gmail.com> wrote:
> 我现在倒是觉得递归非常自然,想算法的时候,首先想的就是这是个递归么
>

> 在07-11-12,hayate <hayate...@gmail.com> 写道:


>
>
>
>
>
> > 嗯 所以训练是必要的
> > 这样来看 也许是件无可奈何的事情 又要不吃草又要跑得快。
>
> > On Nov 12, 2007 3:46 PM, pongba <pon...@gmail.com> wrote:
>

> > > On Nov 12, 2007 3:41 PM, hayate <hayate...@gmail.com> wrote:
> > > > 这恰恰是需要避免的思考方式
> > > > 递归描述的是N(n+1) =F(N(n)) 你的意思是一般人容易去想n-1 n-2 .... 这一方面是没有受过专业的训练
> > > > 另一方面是一种本能的怀疑和不信任感,因为人们总是难以假设N(n)是绝对正确的。
> > > > 如果能克服这一点,就会好多了
>
> > > Yup, that's right ;)
> > > 问题就是,常人不会一开始就这么做。以及常人为什么一开始不这么做呢?
>
> > > > On Nov 12, 2007 3:32 PM, pongba < pon...@gmail.com> wrote:
> > > > > 我觉得递归之所以难以grok,是因为当人脑去模拟递归运行的时候,需要模拟一个栈,这个栈随着递归层次的加深会出现两个问题:
> > > > > 1.
>
> > 人脑需要保存越来越多的临时变量。大家都知道,通常人能够短期存放在脑子里面的信息是有限的,有时候为了辅助思维甚至要一边思考一边写,以免想着想着就忘掉前面的了。
> > > > > 2. 每层栈上的几个变量都是重名的。给人脑带来很大的混淆。都是同样的几个参数,却在不同的时间点上具有不同的值。
>
> > > > > 如果是循环,想想看会有什么不同?
>

> > > > > On Nov 12, 2007 3:27 PM, 莫华枫 <longshank...@gmail.com> wrote:
> > > > > > 你是说fp需要我们把脑袋训练成多核的?:-)
>
> > > > > > 在07-11-12,red...@gmail.com < red...@gmail.com> 写道:
>
> > > > > > > 递归需要脑袋同时考虑多个 context 的影响, 动态性比循环强, not brain friendly.
>
> > > > > > > 当然, 如果一个语言将所有东西都归结到递归上, 习惯了也就可以使用了, 脑袋还
> > > > > > > 是容易训练的.
>
> > > > > > > 王磊 写道:
> > > > > > > > 一直无法正确理解递归这一牛X的复杂算法。
> > > > > > > > 偶尔会手动写一些汉诺塔,的移动顺序。。。。A-〉B ,B-〉C。。。。。
>
> > > > > > --
>
> > > > > > 反者道之动,弱者道之用
> > > > > > m...@seaskysh.com

> > > > > > longshank...@gmail.com

莫华枫

unread,
Nov 12, 2007, 8:01:03 PM11/12/07
to pon...@googlegroups.com
递归的确更本质,更自然。不过很多情况下本质的东西更不容易为人理解。比如相对论。

在07-11-12,Googol Lee <goog...@gmail.com> 写道:

王宁

unread,
Nov 12, 2007, 8:48:02 PM11/12/07
to pon...@googlegroups.com
本质的东西往往不自然。你用循环和递归去教小孩子,哪种接受的快那种就更自然,呵呵。

Yong Yuan

unread,
Nov 12, 2007, 9:41:18 PM11/12/07
to pon...@googlegroups.com
教小孩子不知道。当年学数列求和的时候,还是递归的方法容易求解一些哈。

莫华枫

unread,
Nov 12, 2007, 10:10:20 PM11/12/07
to pon...@googlegroups.com
呵呵,看来词汇有歧义啊。我说的自然是"道法自然"的自然,不是人思考问题的自然。

在07-11-13,王宁 <nwan...@gmail.com> 写道:

怀宇范

unread,
Nov 12, 2007, 10:20:36 PM11/12/07
to pon...@googlegroups.com
大家一起来玩imaginecup算法比赛吧。。呵呵。。练递归。。。
--
bool ContactMe(person you)
{
   if(you.GoTo("14#344, Tsinghua") && you.Find("Fan Huaiyu"))return true;
   if(you.MailTo (" dugu...@gmail.com ") || you.MailTo(" fan...@mails.tsinghua.edu.cn "))return true;
   if(you.PhoneTo ("13488810330") || you.PhoneTo("01062778689"))return true;
   if(you.QQTo("120628812") || you.MSNTo("dugu...@hotmail.com"))return true;
   if(you.NetTo(" www.cnblogs.com/duguguiyu "))return true;
   return false;
}

pongba

unread,
Nov 12, 2007, 10:27:31 PM11/12/07
to pon...@googlegroups.com
呃,那样说的话就既不是递归也不是循环,而是"重复".. :)

On Nov 13, 2007 11:10 AM, 莫华枫 <longsh...@gmail.com> wrote:

莫华枫

unread,
Nov 12, 2007, 10:31:48 PM11/12/07
to pon...@googlegroups.com
哦?重复是本质,递归、循环是形式。
够本质(呵呵,"自然")。:)

在07-11-13,pongba <pon...@gmail.com> 写道:

王磊

unread,
Nov 12, 2007, 10:33:10 PM11/12/07
to pon...@googlegroups.com
从人的角度来说,递归肯定不自然。。。。。汗!
人脑线性索引思维吧?~

 
在07-11-13,pongba <pon...@gmail.com> 写道:

李一楠

unread,
Nov 13, 2007, 5:38:08 AM11/13/07
to pon...@googlegroups.com
不见得更本质啊。
递归之本质之处在于其直接源自数学的函数/映射定义。
重复治本之之处在于其直接源自时序/因果关系。
相对论不容易理解只是因为它来自非欧几何。
牛顿力学匹配于欧氏几何,它容易理解是由于人们的大脑通过日常经验建立了这个空间的模型。
重复/循环的容易理解也在于人们的大脑的自然的时序工作模型
 
 
 

在2007-11-13,"莫华枫" <longsh...@gmail.com> 写道:
递归的确更本质,更自然。不过很多情况下本质的东西更不容易为人理解。比如相对论。

Reply all
Reply to author
Forward
0 new messages