top

聽說是某天很夯的 fibonacci number XD

我看到 Python Taiwan 在 FB 上的社團:
http://www.facebook.com/groups/ ... /10152155561273438/

很有趣,有人說是 Functional python,不過我看到了 append … 用了 append 就不是純函數式了… 所以我順手寫了一個 …
  1. print((lambda n: (lambda f: [f(i, f) for i in range(0, n)]))(10)(lambda n, fib: n if(n == 0 or n == 1) else fib(n - 1, fib) + fib(n - 2, fib)))
複製程式碼

把 10 改成任何你要的數,就可以是求該數量的費式數…XD

The Little JavaScripter by Douglas Crockford
http://www.crockford.com/javascript/little.html

TOP

TOP

那就來寫個 Python 版的吧!... XD
  1. def y(f):
  2.     return (lambda r: f(lambda n: r(r)(n)))(lambda r: f(lambda n: r(r)(n)))
複製程式碼

TOP

參考一下 The Y Combinator explained with JavaScript
http://kestas.kuliukas.com/YCombinatorExplained/

TOP

其實這只是好玩才這樣寫的,要知道思路的出發點,建議你看這個:
http://www.byvoid.com/upload/fl/images/FP/FP.pdf

我用到的是其中第 16 頁開始之後的概念 …

就實作來說:以下建立一個 lambda,並傳入 10:
  1. (lambda n: (lambda f: [f(i, f) for i in range(0, n)]))(10)
複製程式碼
執行後會有個 lambda 傳回 … 也就是 …
  1. (lambda f: [f(i, f) for i in range(0, n)])
複製程式碼
這個 lambda 需要一個 lambda,將由 f 參考對吧!所以我傳入了 …
  1. (lambda n, fib: n if(n == 0 or n == 1) else fib(n - 1, fib) + fib(n - 2, fib))
複製程式碼
這只是純綷想要在一行寫完 … 想要好懂一些的話就這樣 …
  1. def fib_list_to(n):
  2.     return lambda f: [f(i, f) for i in range(0, n)]

  3. def fib_resc(n, fib):
  4.     return n if(n == 0 or n == 1) else fib(n - 1, fib) + fib(n - 2, fib)

  5. print(fib_list_to(10)(fib_resc))
複製程式碼

TOP

回復 1# caterpillar


不好意思,想請問一下有關你寫的code
print((lambda n: (lambda f: [f(i, f) for i in range(0, n)]))(10)(lambda n, fib: n if(n == 0 or n == 1) else fib(n - 1, fib) + fib(n - 2, fib)))
寫法上有一點不太懂

知道裡面有用到 list conprehension, (lambda f: [f(i, f) for i in range(0, n)])
在這之後接的 (10) 以及 (lambda n, fib: n if(n == 0 or n == 1) else fib(n - 1, fib) + fib(n - 2, fib)) 這樣的寫法
程式是怎麼去判斷的?

謝謝你的指教

TOP

好像是在解這個 Challenge?
http://p2pu.org/en/groups/pytho ... ramming-challenges/

TOP