代码:
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 1
之前看到使用yield生成fab数,从最简单的方法,到使用list存储,再到定义一个类的next()方法,最后再来一记yield,真是惊艳到了。
|
5
66beta 2015-06-17 15:49:16 +08:00 1
哼,格式不对,没对齐
|
6
est 2015-06-17 15:51:31 +08:00 1
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 2
定义一个函数 fib 用来输入任意位的Fibonacci 数列
fib 0 = 0 fib 1 = 1 fib n = fib (n-1) + fib (n-2) |
8
TimLang 2015-06-17 16:03:47 +08:00
看了下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-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 1
```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 1
@dtdnqsb 变量名随便起,一样只不过是为了跟LZ的代码对应。你要是不喜欢,我改成 `杨辉三角.take(10)` 怎么样?
|
15
jsyangwenjie 2015-06-17 17:00:49 +08:00 1
这。。
你随便学一门函数式语言就写得出来的。。 |
17
luciankaltz 2015-06-17 17:21:32 +08:00
Python弱鸡被惊艳到了。。。
|
19
Tiande OP @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 1
@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 1
上门第一行写错了, 是 def fib(n) when n <= 1, do:n
|
32
karloku 2015-06-17 23:04:31 +08:00 1
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 @xuyl
# 函数写好后,实例化 result = triangles() i = 1 for a in result: ....i = i + 1 ....print(a) ....if i > 10: # 限定循环次数 ........break |
34
Tiande OP @jsyangwenjie
谢谢,然而并不懂你说的函数式编程... |
35
msg7086 2015-06-18 07:32:12 +08:00 1
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 1
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 1
很美丽~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 1
刚学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 2
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(' ')); ``` |