代码:
def triangles():
....a = [1];
....while True:
........yield a
........a = [sum(i) for i in zip([0] + a, a + [0])]
部分结果:
$ python python/pytest.py [1] [1, 1] [1, 2, 1] [1, 3, 3, 1] [1, 4, 6, 4, 1] [1, 5, 10, 10, 5, 1] [1, 6, 15, 20, 15, 6, 1] [1, 7, 21, 35, 35, 21, 7, 1] [1, 8, 28, 56, 70, 56, 28, 8, 1] [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
真是爆za了 ;)
1 ColorfulNight 2015-06-17 14:46:48 +08:00 我用C的队列写过,但是不知道为什么当行数一大就会出错 |
![]() | 2 sinux 2015-06-17 14:52:33 +08:00 nice job |
![]() | 3 elvis_w 2015-06-17 15:09:37 +08:00 Python的生成器函数,不错 |
![]() | 4 zerh925 2015-06-17 15:46:21 +08:00 ![]() 之前看到使用yield生成fab数,从最简单的方法,到使用list存储,再到定义一个类的next()方法,最后再来一记yield,真是惊艳到了。 |
![]() | 5 66beta 2015-06-17 15:49:16 +08:00 ![]() 哼,格式不对,没对齐 |
![]() | 6 est 2015-06-17 15:51:31 +08:00 ![]() pascal = map ([1,1]^) [0..] take 5 pascal -- [[1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1]] 还是有更加高级的语言的描述能力能秒杀python的。 |
![]() | 7 est 2015-06-17 15:54:32 +08:00 ![]() 定义一个函数 fib 用来输入任意位的Fibonacci 数列 fib 0 = 0 fib 1 = 1 fib n = fib (n-1) + fib (n-2) |
td width="auto" valign="top" align="left"> |
![]() | 9 codercai 2015-06-17 16:28:56 +08:00 graceful job! |
![]() | 10 Vlux 2015-06-17 16:38:15 +08:00 人生苦短。pythonic |
11 some0ne 2015-06-17 16:41:47 +08:00 ![]() ```ruby triangles = Enumerator.new do |yielder| a = [1] loop do yielder << a a = ([0] + a).zip(a + [0]).map {|i| i.reduce(:+) } end end triangles.take(10).each {|row| p row } ``` 相同功能的ruby版 |
14 some0ne 2015-06-17 16:58:18 +08:00 ![]() @dtdnqsb 变量名随便起,一样只不过是为了跟LZ的代码对应。你要是不喜欢,我改成 `杨辉三角.take(10)` 怎么样? |
![]() | 15 jsyangwenjie 2015-06-17 17:00:49 +08:00 ![]() 这。。 你随便学一门函数式语言就写得出来的。。 |
![]() | 17 luciankaltz 2015-06-17 17:21:32 +08:00 Python弱鸡被惊艳到了。。。 |
![]() | 19 Tiande OP PRO @jsyangwenjie 你就随便拿顺手的语言写个如此简洁的,让大家活儿好好乐乐? 没有嘲讽的意思 -。- |
![]() | 21 pubby 2015-06-17 18:26:49 +08:00 via Android 坐等PHP版 |
![]() | 22 ob 2015-06-17 18:41:07 +08:00 zip里面是啥? |
![]() | 23 zonghua 2015-06-17 18:41:49 +08:00 via iPhone 人生苦短,为了排个杨辉三角,耗费了多少脑力。 |
![]() | 24 jsyangwenjie 2015-06-17 19:08:54 +08:00 ![]() @dtdnqsb yang::Int -> [Int] yang n | n == 0 = [1] | otherwise = map (\x-> fst x + snd x) $ zip ([0] ++ yang (n-1)) (yang (n-1) ++ [0]) 这是人家玩烂了的。。 |
25 lilydjwg 2015-06-17 19:14:59 +08:00 |
![]() | 27 staticor 2015-06-17 20:53:54 +08:00 |
![]() | 29 horx 2015-06-17 21:11:00 +08:00 Fibonacci 数列 Elixir 版: def fib(n) when n < 1, do: n def fib(n), do: fib(n -1) + fib(n - 2) |
![]() | 30 horx 2015-06-17 21:12:39 +08:00 ![]() 上门第一行写错了, 是 def fib(n) when n <= 1, do:n |
![]() | 32 karloku 2015-06-17 23:04:31 +08:00 ![]() pascal = lambda do |n| | n.times.reduce([[1]]) do |rows| | rows << ([0] + rows.last).zip(rows.last + [0]).map {|i| i.reduce(&:+)} | end end |
![]() | 33 Tiande OP PRO @xuyl # 函数写好后,实例化 result = triangles() i = 1 for a in result: ....i = i + 1 ....print(a) ....if i > 10: # 限定循环次数 ........break |
![]() | 34 Tiande OP PRO @jsyangwenjie 谢谢,然而并不懂你说的函数式编程... |
![]() | 35 msg7086 2015-06-18 07:32:12 +08:00 ![]() 4 kyu Pascal's Triangle Ruby: def pascalsTriangle(n) result = p = [1] (n-1).times do p = (p+[0]).zip([0]+p).map{|v|v.reduce(&:+)} result += p end result end 4 days ago 前几天刚写过。 |
![]() | 36 lds56 2015-06-18 10:26:30 +08:00 ![]() Scala 版本 def tri(row:Int):List[Int] = { row match { case 1 => List(1) case n:Int => List(1) ::: ((tri(n-1) zip tri(n-1).tail) map {case (a,b) => a+b}) ::: List(1) } } def prettytri(n:Int) = (1 to n) foreach {i=>print(" "*(n-i)); tri(i) map (c=>print(c+" ")); println} prettytri(5) 出自 http://rosettacode.org/wiki/Pascal's_triangle |
![]() | 37 lds56 2015-06-18 10:29:00 +08:00 感觉 python 的生成器还是不够优雅 |
![]() | 38 xiaoxianyu 2015-06-18 11:26:35 +08:00 ![]() 很美丽~zip原来有这么赞的用法~~~ |
40 yuankui 2015-06-18 14:56:32 +08:00 性能堪忧啊... |
41 yuankui 2015-06-18 14:56:56 +08:00 好多列表的concat |
![]() | 43 forrestchang 2015-06-18 15:16:59 +08:00 ![]() 刚学Swift, 用Swift写了一个,基本的方法 func pascalsTriangle(rows: Int) { if rows < 0 { return } var last = [Int]() last.append(1) println(last) for i in 1..<rows { var thisRow = [Int]() thisRow.append(last.first!) for j in 1..<i { thisRow.append(last[j - 1] + last[j]) } thisRow.append(last.first!) last = thisRow println(thisRow) } } |
![]() | 44 shizukoto 2015-06-18 23:20:02 +08:00 ![]() Javascript (ES6) 实现: ```js const {zip, sum, map, head} = require('aureooms-js-itertools'); function *triangles() { let a = [1]; while (true) { yield a; a = Array.from(map(sum, zip([[0].concat(a), a.concat([0])]))); } } for (let row of head(triangles(), 5)) console.log(row.join(' ')); ``` |