Python 板


LINE

※ 引述《yjc1 (..........)》之铭言: : http://neopythonic.blogspot.com/2009/04/tail-recursion-elimination.html : 解释了这麽多年来一直没把 TRE / TCO(Tail Call Opimization) 加到 python 的原因 : 这些理由可以理解但不太能接受… 连 lua 都 support TCO 了… http://neopythonic.blogspot.com/2009/04/final-words-on-tail-calls.html 再次确认 TCO 无望,但後半段提到的 TCO 替代方案颇有趣 看起来还是可以硬干,只是很丑…… 这些理由中唯一可以说服我的只有 guido 对 stack frame 不能被破坏的坚持, 但个人感觉 stack frame 也没那麽神圣不可侵犯。 而且连放到 -O 才开的方式都冠以「破坏一致性」的大义…就死心了吧… --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.113.23.212
1F:→ yjc1:「To iterate is human; to recurse, divine.」 04/29 01:37
2F:→ yjc1:「递回只应天上有,凡人该当用回圈」 - L. Peter Deutsch 04/29 01:39
3F:推 ykjiang:必要用 TCO 的案例,都可以很容易用 loop 写吧, 04/29 12:11
4F:→ ykjiang:例如算阶乘等,为什麽这种东西坚持要用递回写? 04/29 12:12
5F:→ sbrhsieh:为了让 Python 更向 functional programming 靠拢? 04/29 18:09
6F:推 ykjiang:以算阶层来说,就算用 FP ,也不必用到递回 04/29 18:45
7F:→ ykjiang:reduce(lambda a, b: a+b, range(10)) 04/29 18:48
8F:→ ykjiang:f=lambda x: reduce(lambda a, b: a*b, range(1,x+1)) 04/29 18:53
9F:→ ykjiang:f(3) 04/29 18:54
10F:→ ykjiang:6 04/29 18:54
11F:推 ykjiang:我不反对递回,而是反对要动用 TCO 才跑得好的程式写法 04/29 18:57
12F:→ ykjiang:这对数学家也许很有趣,但不符合工程美学 04/29 18:58
13F:→ ykjiang:Explicit is better than implicit. 04/29 19:06
14F:→ ykjiang:Simple is better than complex. 04/29 19:06
15F:→ sbrhsieh:你有考虑 reduce 是如何实做的吗?应该是iterative作法 04/29 19:34
16F:→ sbrhsieh:loop 在 iteration 之间有额外的状态必须正确维持住 04/29 19:44
17F:→ sbrhsieh:不过我认为你以reduce实做阶层计算跟使用tail-recursion 04/29 20:01
18F:→ sbrhsieh:来实做的精神几乎一样了 04/29 20:02
19F:推 ykjiang:tail-recursion 是特定递回写法照成的现象; 04/29 21:02
20F:→ ykjiang:reduce 的背後,基本上就是 iterative ,跟递回不相干 04/29 21:04
21F:推 ykjiang:这样说好了,你手算阶乘时是怎麽算的?有简明的写法, 04/29 21:18
22F:→ ykjiang:有简单明了的写法时,为甚麽要用递回来写? 04/29 21:19
23F:→ ykjiang:我用递回的原则就是问:这样写有比较简单吗? 04/29 21:20
24F:→ ykjiang:Python 支援 TCO 的话,某种程度就是鼓励人写 TC 04/29 21:22
25F:→ ykjiang:而我看过的 TC 程式都比它的非 TC 版本来得晦暗; 04/29 21:23
26F:→ ykjiang:TC 的写法把简单的事情复杂化 04/29 21:23
27F:→ ykjiang:以上是我的观点 04/29 21:24
28F:推 godfat:对不熟悉递回的人而言递回是不好懂;反之是很单纯又直觉的 04/29 21:25
29F:→ ykjiang:There should be one 04/29 21:26
30F:→ ykjiang:-- and preferably only one --obvious way to do it. 04/29 21:27
31F:→ ykjiang:quicksort 以递回写就比较简明;乘阶以递回写比较晦暗 04/29 21:34
32F:→ poga:我倒觉得用递回写factorial一点都不晦暗... 04/29 23:18
33F:→ yjc1:照 yk 的说法,那 list comprehension 与 lambda 也不应该加 04/30 00:00
34F:→ yjc1:入 python 当中 04/30 00:00
35F:→ yjc1:lambda 不够直觉, list comprehension 不够 explicit 04/30 00:02
36F:→ yjc1:但这两项暨没有破坏 stack frame 也无破坏一致性的问题,所以 04/30 00:04
37F:→ yjc1:我才说可以接受 guido 这样的说法 04/30 00:04
38F:→ yjc1:另外,递回只是种工具,有其适合的场合与不适用的场合 04/30 00:10
39F:→ yjc1:总不能因为有人不熟 OOP 就叫他不要在c++/java里用oop吧 04/30 00:11
40F:推 Lucemia:但是python 允许使用递回、只是限制在1000层的范围内 04/30 00:29
41F:→ Lucemia:以工具使用上来用是足够的 04/30 00:32
42F:推 ykjiang:factorial 以递回写确实很明确,跟定义方式一样 :) 04/30 01:04
43F:→ ykjiang:list comprehension 提出的原因就是它较 explicit 04/30 01:05
44F:→ ykjiang:有些场合用 lambda 很方便,虽然我觉得这个 term 很无俚头 04/30 01:16
45F:→ sbrhsieh:function call 的 overhead 是不是变相不鼓励递回解? 04/30 01:25
46F:→ ykjiang:就如 L 说的,Python 还是允许大家用递回, 04/30 01:25
47F:→ ykjiang:只要不要像 TC 类造成 recursion 灾难就好... 04/30 01:27
48F:→ ykjiang:还有,就是值不值得,加了 TCO 压缩到其他功能的开发资源 04/30 01:32
49F:→ yjc1:lambda 是无俚头的 term…… TCO压缩到其他功能开发资源…… 04/30 02:35
50F:→ poga:我感受到一股Blob吊诡的味道... 04/30 03:07
51F:→ poga: Blub sorry 04/30 03:22
52F:→ ykjiang:lambda 对知道典故的人当然不会无俚头, 04/30 10:22
53F:→ ykjiang:只是觉得应该有更直觉的写法才对,虽然我不知它该是什麽 04/30 10:23
54F:推 dotZu:对於函数式程式语言的爱好者而言,lambda和递回都很直觉 04/30 15:04
55F:→ dotZu:不过 Guido 说他不是函数式程式语言的爱好者 XD 04/30 15:05
56F:推 ykjiang:lambda 名称是由 Lisp 来的,当初本来就是乱取个名字来用 05/04 12:17
57F:→ ykjiang:可以参考各种语言对相似语意的语法差异: 05/04 12:17
58F:→ ykjiang:Lisp: (lambda (arg) "hello world") 05/04 12:18
59F:→ ykjiang:Smalltalk: [arg| ^"hello world"] 05/04 12:18
60F:→ ykjiang:Ruby: 5.times {|x| puts x} 05/04 12:19
61F:→ ykjiang:大家不觉得 Smalltalk 或 Ruby 的用法比较简洁有力吗? 05/04 12:20
62F:→ poga:lambda是从lambda calculus来的吧... 05/04 21:57
63F:→ poga:不过前後关系我不知道,可能得请PLT那边的来(倒 05/04 22:01
65F:→ yjc1:好歹先翻一下相关资料再讨论吧. 05/04 23:00
66F:推 godfat:我喜欢 Haskell. \x -> x + 1. 另,ruby 用 lambda{ ... } 05/05 00:19
67F:→ ykjiang:我知道 lambda calculus 是 Church 提出来的, 05/05 21:17
68F:→ ykjiang:它跟 Lisp 的渊源是我记错了;不过没差,名字还是随意取的 05/05 21:18
69F:→ ykjiang:新的 ruby 好像有新的语法糖衣,比 lambda term 简便 05/05 21:19
70F:→ godfat:ruby 1.9 可以这样用:->x{x+1} 这是学自 perl 6 的,但 05/05 22:45
71F:→ godfat:其实很多人反对这种用法,觉得 -> 一点都不像 lambda 05/05 22:46
72F:→ godfat:我自己试试的结果是,这样写长一点时,其实是真的不好看 05/05 22:46
73F:→ ykjiang:相较於 lambda calculus ,工程师应该对 Turing Machine 05/05 23:05
74F:→ ykjiang:感到较亲切,虽然两者的计算能力是等效的 05/05 23:06
75F:→ ykjiang:不过 Turing Machine 比较像 Machine :p 05/05 23:06







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Soft_Job站内搜寻

TOP