→ yjc1:「To iterate is human; to recurse, divine.」 04/29 01:37
→ yjc1:「遞迴只應天上有,凡人該當用迴圈」 - L. Peter Deutsch 04/29 01:39
推 ykjiang:必要用 TCO 的案例,都可以很容易用 loop 寫吧, 04/29 12:11
→ ykjiang:例如算階乘等,為什麼這種東西堅持要用遞迴寫? 04/29 12:12
→ sbrhsieh:為了讓 Python 更向 functional programming 靠攏? 04/29 18:09
推 ykjiang:以算階層來說,就算用 FP ,也不必用到遞迴 04/29 18:45
→ ykjiang:reduce(lambda a, b: a+b, range(10)) 04/29 18:48
→ ykjiang:f=lambda x: reduce(lambda a, b: a*b, range(1,x+1)) 04/29 18:53
→ ykjiang:f(3) 04/29 18:54
→ ykjiang:6 04/29 18:54
推 ykjiang:我不反對遞迴,而是反對要動用 TCO 才跑得好的程式寫法 04/29 18:57
→ ykjiang:這對數學家也許很有趣,但不符合工程美學 04/29 18:58
→ ykjiang:Explicit is better than implicit. 04/29 19:06
→ ykjiang:Simple is better than complex. 04/29 19:06
→ sbrhsieh:你有考慮 reduce 是如何實做的嗎?應該是iterative作法 04/29 19:34
→ sbrhsieh:loop 在 iteration 之間有額外的狀態必須正確維持住 04/29 19:44
→ sbrhsieh:不過我認為你以reduce實做階層計算跟使用tail-recursion 04/29 20:01
→ sbrhsieh:來實做的精神幾乎一樣了 04/29 20:02
推 ykjiang:tail-recursion 是特定遞迴寫法照成的現象; 04/29 21:02
→ ykjiang:reduce 的背後,基本上就是 iterative ,跟遞迴不相干 04/29 21:04
推 ykjiang:這樣說好了,你手算階乘時是怎麼算的?有簡明的寫法, 04/29 21:18
→ ykjiang:有簡單明瞭的寫法時,為甚麼要用遞迴來寫? 04/29 21:19
→ ykjiang:我用遞迴的原則就是問:這樣寫有比較簡單嗎? 04/29 21:20
→ ykjiang:Python 支援 TCO 的話,某種程度就是鼓勵人寫 TC 04/29 21:22
→ ykjiang:而我看過的 TC 程式都比它的非 TC 版本來得晦暗; 04/29 21:23
→ ykjiang:TC 的寫法把簡單的事情複雜化 04/29 21:23
→ ykjiang:以上是我的觀點 04/29 21:24
推 godfat:對不熟悉遞迴的人而言遞迴是不好懂;反之是很單純又直覺的 04/29 21:25
→ ykjiang:There should be one 04/29 21:26
→ ykjiang:-- and preferably only one --obvious way to do it. 04/29 21:27
→ ykjiang:quicksort 以遞迴寫就比較簡明;乘階以遞迴寫比較晦暗 04/29 21:34
→ poga:我倒覺得用遞迴寫factorial一點都不晦暗... 04/29 23:18
→ yjc1:照 yk 的說法,那 list comprehension 與 lambda 也不應該加 04/30 00:00
→ yjc1:入 python 當中 04/30 00:00
→ yjc1:lambda 不夠直覺, list comprehension 不夠 explicit 04/30 00:02
→ yjc1:但這兩項暨沒有破壞 stack frame 也無破壞一致性的問題,所以 04/30 00:04
→ yjc1:我才說可以接受 guido 這樣的說法 04/30 00:04
→ yjc1:另外,遞迴只是種工具,有其適合的場合與不適用的場合 04/30 00:10
→ yjc1:總不能因為有人不熟 OOP 就叫他不要在c++/java裡用oop吧 04/30 00:11
推 Lucemia:但是python 允許使用遞迴、只是限制在1000層的範圍內 04/30 00:29
→ Lucemia:以工具使用上來用是足夠的 04/30 00:32
推 ykjiang:factorial 以遞迴寫確實很明確,跟定義方式一樣 :) 04/30 01:04
→ ykjiang:list comprehension 提出的原因就是它較 explicit 04/30 01:05
→ ykjiang:有些場合用 lambda 很方便,雖然我覺得這個 term 很無俚頭 04/30 01:16
→ sbrhsieh:function call 的 overhead 是不是變相不鼓勵遞迴解? 04/30 01:25
→ ykjiang:就如 L 說的,Python 還是允許大家用遞迴, 04/30 01:25
→ ykjiang:只要不要像 TC 類造成 recursion 災難就好... 04/30 01:27
→ ykjiang:還有,就是值不值得,加了 TCO 壓縮到其他功能的開發資源 04/30 01:32
→ yjc1:lambda 是無俚頭的 term…… TCO壓縮到其他功能開發資源…… 04/30 02:35
→ poga:我感受到一股Blob弔詭的味道... 04/30 03:07
→ poga: Blub sorry 04/30 03:22
→ ykjiang:lambda 對知道典故的人當然不會無俚頭, 04/30 10:22
→ ykjiang:只是覺得應該有更直覺的寫法才對,雖然我不知它該是什麼 04/30 10:23
推 dotZu:對於函數式程式語言的愛好者而言,lambda和遞迴都很直覺 04/30 15:04
→ dotZu:不過 Guido 說他不是函數式程式語言的愛好者 XD 04/30 15:05
推 ykjiang:lambda 名稱是由 Lisp 來的,當初本來就是亂取個名字來用 05/04 12:17
→ ykjiang:可以參考各種語言對相似語意的語法差異: 05/04 12:17
→ ykjiang:Lisp: (lambda (arg) "hello world") 05/04 12:18
→ ykjiang:Smalltalk: [arg| ^"hello world"] 05/04 12:18
→ ykjiang:Ruby: 5.times {|x| puts x} 05/04 12:19
→ ykjiang:大家不覺得 Smalltalk 或 Ruby 的用法比較簡潔有力嗎? 05/04 12:20
→ poga:lambda是從lambda calculus來的吧... 05/04 21:57
→ poga:不過前後關係我不知道,可能得請PLT那邊的來(倒 05/04 22:01
→ yjc1:好歹先翻一下相關資料再討論吧. 05/04 23:00
推 godfat:我喜歡 Haskell. \x -> x + 1. 另,ruby 用 lambda{ ... } 05/05 00:19
→ ykjiang:我知道 lambda calculus 是 Church 提出來的, 05/05 21:17
→ ykjiang:它跟 Lisp 的淵源是我記錯了;不過沒差,名字還是隨意取的 05/05 21:18
→ ykjiang:新的 ruby 好像有新的語法糖衣,比 lambda term 簡便 05/05 21:19
→ godfat:ruby 1.9 可以這樣用:->x{x+1} 這是學自 perl 6 的,但 05/05 22:45
→ godfat:其實很多人反對這種用法,覺得 -> 一點都不像 lambda 05/05 22:46
→ godfat:我自己試試的結果是,這樣寫長一點時,其實是真的不好看 05/05 22:46
→ ykjiang:相較於 lambda calculus ,工程師應該對 Turing Machine 05/05 23:05
→ ykjiang:感到較親切,雖然兩者的計算能力是等效的 05/05 23:06
→ ykjiang:不過 Turing Machine 比較像 Machine :p 05/05 23:06