命令式编程和函数式编程的区别

The difference between imperative and functional programming

命令式编程和函数式编程的区别

第一次尝试翻译外国的技术文章,很担心自己的语言不够准确。尝试尝试,总要迈出这一步的!

 

你是否有过这样的沮丧经历?我要开车去一个我从来没去过的地方,于是我网上查看关于这个地方的信息。浏览网页,想找到地址和邮编。不过,我却找到了这样的东西:

你可以通过以下方式找到我们:最简单的路径是,从伦敦的东南上A4136路往西南方向进发。在直通往Ruardean的莫斯路处向右转,直走。我们就在右手边,一个限速30英里每小时的路标不远处。

我本来不想知道如何到达这个地方的指令。我仅仅想知道地址在哪,因为只要知道了地址,我就能通过谷歌地图或者卫星导航系统的帮助,找到这个地方。(这里省略了一些作者的调侃)

总结来说:邮编和地址,告诉了我地点在哪;网站上的指示告诉了我如何到达这个地点。

 

这二者的区别,就与命令式编程和函数式编程的核心区别很类似。命令式编程就是我们平时经常做的;而函数式编程则略显学术和奇葩。

先避开上面这段话不谈,我们是否已经承认了“函数式”的地址要比“指令式”的地址要好呢?函数式的地址给我们更高的自由来找出如何实施。而且这种方式没有对初始条件(从伦敦触发)的要求。倘若你从加迪夫来那怎么办呢?根据指令式地址,你要先开车到伦敦,然后按照上述的方法到达你想去的地方。这方法不会是最优的。

 

一个函数式的程序是什么样的?/*中间有一段我没看懂……实在是不知道作者在说什么……放上原文吧*/At the risk of perpetuating a cliché,consider the toy problem of factorials.  (I nearly said “the problem of calculatingfactorials, but even saying it that way pre-supposesan imperative approach to solving the problem.)  A factorial is a produce of a specified integer and all smaller positive integers, so that factorial(5)is 1 * 2 * 3 * 4 * 5 = 120.  And the obvious way to write a function for that is of course:

def factorial(x)
    res = 1
    while (x > 1)
        res = res*x
        x = x-1
    end
    res
end

这个命令行代码很简单简洁,又不容易出错。(虽然我承认我在写这篇文章的时候漏掉了 x= x-1这句,于是这代码成了死循环,阿欧~

 

刚才那个是命令式代码,程序告诉了我们怎么算阶乘。

但是下面的函数式代码只是告诉我们什么是阶乘。一个数乘以比它小一的数的阶乘。也就是 f(n) = n * f(n-1); (我使用Ruby作为两种编程模式的可执行伪代码,这样就不会导致我想表达的思想因为编程语言的语法不同而模糊)

def factorial(x)
    if x < 2
        1
    else
        x*factorial(x-1)
    end
end

这个版本的看起来也挺好。那当然,因为我做了点小改动。答案就在于1的阶乘就等1,这里就不需要算其他比一小的数的阶乘了。/*说实话,我不懂作者什么意思*/

 

现在看,那个版本的代码更好?这关乎到评定的观点和角度。把效率性能放开不管,只考虑代码的可理解性,哪一个更清晰?我实在分辨不出。

当然,原因是这两段函数太短、太简单,又很容易读懂、理解。所以难以分辨。不过我们真正地问题在:哪一种方式的代码解决问题的途径能更好的应用于实际问题。每种语言独自的性情和内在优点差不多平等的决定了这个问题的答案。/*最后一句原句:Andthe answer to that seems to depend as much on the temperament of the individualas it does on the intrinsic merits of one approach of the other.*/

我也想很多程序员一样,从命令式编程入门,但曾经反复被函数是编程吸引。经常看到应用,但是从未迈进到用函数式风格实际解决问题的层次,有的只不过是解决一下智力问题而已。是时候改变了:我要在函数式语言的典范Lisp上尝试。

让我声明一下:我不是把我设为一个楷模来教育哪些人,因为我对这些也几乎什么都不知道。我只是希望我的记录能帮助那些后来的旅者,希望他们能避免我所犯下的错误。并且真诚的希望那些走在我前面的人看到我徘徊的时候能警醒我。

后面是一个作者最喜欢的笑话,直接上英文版的吧……

A favorite joke of mine (not original to me, but I don’t remember where it’s from).  The university’s Health and Safety officer is checking that the faculties know what to do in the event of a fire. He asks an engineer, “What would you do if you were locked in the laboratory and a fire broke out?”  The engineer thinks for a moment and says “The centrifuge in the lab is pretty heavy: I’d use that to smash the door down and make my escape”.  ”Very good”, says the H&S guy, and turns to a mathematician.  ”And what would you do”, he asks, “If you were up on the roof when a fire broke out?”  Quick as a flash, she replies “I’d lock myself in the engineering lab, thus reducing the problem to one that has already been solved.”

 

原文出处http://reprog.wordpress.com/2010/03/11/the-difference-between-imperative-and-functional-programming/

后记,本次翻译以半失败告终,在dreamrunner的指点下,我才发现了自己一个重要错误。主用语句翻译,遇到实在看不懂的就跳过。
导致我对文章结构理解出了偏差。
今后不仅要翻译句子,更要着重看表达的中心,以及文章结构。
这个是dreamrunner提供的参考资料
http://www.cl.cam.ac.uk/~jrh13/slides/funprog-jrh/l1.pdf
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值