使用指令碼列印楊輝三角

xie仗劍天涯發表於2017-07-10

楊輝三角,是二項式係數在三角形中的一種幾何排列。

 

使用shell 和python 列印楊輝三角,比較差異

shell:

root@virtual:~# cat triangles.sh 
#!/bin/bash
# Author: xieshengsen

# 列印數學楊輝三角

if (test -z $1) ; then
read -p "Input Max Lines:" Max
else
Max=$1
fi

i=1
while [ $i -le $Max ]
do
j=1
while [ $j -le $i ]
do
f=$[i-1]
g=$[j-1]
if [ $j -eq $i ] || [ $j -eq 1 ]; then
declare SUM_${i}_$j=1
else
declare A=$[SUM_${f}_$j]
declare B=$[SUM_${f}_$g]
declare SUM_${i}_$j=`expr $A + $B`
fi
echo -en $[SUM_${i}_$j]" "
let j++
done
echo
let i++
done
root@virtual:~#

root@virtual:~# . triangles.sh 10
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 
root@virtual:~#

  

 

python:

方法一:

[root@cinder01 ~]# cat triangle_v1.py 
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author:xieshengsen

# 使用函式列印楊輝三角

"""
第一次迴圈執行 yield L,輸出【1】
第二次迴圈執行 yield L 之後的語句 L.append(0)後,L =【1,0】,再執行後面的語句 L = [L[i - 1] + L[i] for i in range(len(L))] 此時L =【1,1】(i=0時 L[- 1] + L[0]為1,i =1時 L[0] + L[1]為1)直到再次遇到yield L語句,輸出【1,1】
第三次迴圈執行 yield L 之後的語句 L.append(0)後,L =【1,1,0】,再執行後面的語句 L = [L[i - 1] + L[i] for i in range(len(L))] 此時L =【1,2,1】(i=0時 L[- 1] + L[0]為1,i =1時 L[0] + L[1]為2,i=2時,L[1] + L[2]為1)直到再次遇到yield L語句,輸出【1,2,1】
"""


def triangles(n):
L = [1]
while True:
yield L
L.append(0)
L = [L[ i - 1 ] + L[i] for i in range(len(L))]
if len(L) > n:
break
m = triangles(10)
for i in m:
print (i)
[root@cinder01 ~]# python triangle_v1.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]
[root@cinder01 ~]#

  

 

方法二:

[root@cinder01 ~]# cat triangle_v2.py 
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author:xieshengsen

"""
規律:
1、每行開始和結尾都是1
2、每行的數都是從兩邊都中間逐步變大(除第一、二行外)
3、從第三行開始,每個數都等於上方兩個數之和
4、第n行有n個項
5、每行的數字之和為2的n-1次方(上期寫的是n-2)
"""

def triangles(n):
L = [1]
while True:
yield L
L = [L[x]+L[x+1] for x in range(len(L)-1)]
L.insert(0,1)
L.append(1)
if len(L) > n:
break

a = triangles(10)
for i in a:
print (i)
[root@cinder01 ~]# python triangle_v2.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]
[root@cinder01 ~]#

  

 

相關文章