
代码:
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 年 6 月 17 日 我用C的队列写过,但是不知道为什么当行数一大就会出错 |
2 sinux 2015 年 6 月 17 日 nice job |
3 elvis_w 2015 年 6 月 17 日 Python的生成器函数,不错 |
4 zerh925 2015 年 6 月 17 日 之前看到使用yield生成fab数,从最简单的方法,到使用list存储,再到定义一个类的next()方法,最后再来一记yield,真是惊艳到了。 |
5 66beta 2015 年 6 月 17 日 哼,格式不对,没对齐 |
6 est 2015 年 6 月 17 日 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 年 6 月 17 日 定义一个函数 fib 用来输入任意位的Fibonacci 数列 fib 0 = 0 fib 1 = 1 fib n = fib (n-1) + fib (n-2) |
8 TimLang 2015 年 6 月 17 日 看了下python的yield和ruby的yield完全不是一个意思啊。下面是Ruby代码,ruby不需要生成器。 ```ruby def pascal(n) ar = [1] while n > 1 ar.unshift(0).push(0) # tack a zero on both ends yield ar = ar.each_cons(2).map{|a, b| a + b } n=n-1 end end puts pascal(5){|row| p row} |
9 codercai 2015 年 6 月 17 日 graceful job! |
10 Vlux 2015 年 6 月 17 日 人生苦短。pythonic |
11 some0ne 2015 年 6 月 17 日 ```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版 |
15 jsyangwenjie 2015 年 6 月 17 日 这。。 你随便学一门函数式语言就写得出来的。。 |
17 luciankaltz 2015 年 6 月 17 日 Python弱鸡被惊艳到了。。。 |
19 Tiande OP PRO @jsyangwenjie 你就随便拿顺手的语言写个如此简洁的,让大家活儿好好乐乐? 没有嘲讽的意思 -。- |
21 pubby 2015 年 6 月 17 日 via Android 坐等PHP版 |
22 ob 2015 年 6 月 17 日 zip里面是啥? |
23 zonghua 2015 年 6 月 17 日 via iPhone 人生苦短,为了排个杨辉三角,耗费了多少脑力。 |
24 jsyangwenjie 2015 年 6 月 17 日 @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]) 这是人家玩烂了的。。 |
27 staticor 2015 年 6 月 17 日 |
29 horx 2015 年 6 月 17 日 Fibonacci 数列 Elixir 版: def fib(n) when n < 1, do: n def fib(n), do: fib(n -1) + fib(n - 2) |
30 horx 2015 年 6 月 17 日 上门第一行写错了, 是 def fib(n) when n <= 1, o:n |
32 karloku 2015 年 6 月 17 日 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 年 6 月 18 日 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 年 6 月 18 日 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 年 6 月 18 日 感觉 python 的生成器还是不够优雅 |
38 xiaoxianyu 2015 年 6 月 18 日 很美丽~zip原来有这么赞的用法~~~ |
40 yuankui 2015 年 6 月 18 日 性能堪忧啊... |
41 yuankui 2015 年 6 月 18 日 好多列表的concat |
43 forrestchang 2015 年 6 月 18 日 刚学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 年 6 月 18 日 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(' ')); ``` |