用python实现杨辉三角的几种不同方式
生活随笔
收集整理的這篇文章主要介紹了
用python实现杨辉三角的几种不同方式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
楊輝三角的概念
比較詳細的知識可以看這里,在楊輝三角中,每個數是它左上方和右上方的數的和。
1/ \1 1/ \ / \1 2 1/ \ / \ / \1 3 3 1/ \ / \ / \ / \1 4 6 4 1/ \ / \ / \ / \ / \
1 5 10 10 5 1
解法1:動態規劃
- 思路:
如果能夠知道一行楊輝三角,我們就可以根據每對相鄰的值輕松地計算出它的下一行。 - 解法:
首先,我們會生成整個 triangle 列表,三角形的每一行都以子列表的形式存儲。然后,我們會檢查行數為0的特殊情況,否則我們會返回[1]。如果行數大于1,那么我們用[1]作為第一行來初始化,所以可以得到如下程序:
def generate(num_rows):triangle = []for row_num in range(num_rows):# 初始化zhenghangsrow = [None for _ in range(row_num+1)]# 將第一個數和最后一個數設置為1row[0], row[-1] = 1, 1for j in range(1, len(row)-1):row[j] = triangle[row_num-1][j-1] + triangle[row_num-1][j]triangle.append(row)return triangle
解法2:生成器
本質上和解法1的思想一致,但是可以使用生成器來都程序進行改寫,程序如下:
def generate(num_rows):def triangles():t = [1]while True:yield ts = [0] + tt = t + [0]for i in range(len(s)):t[i] = s[i] + t[i]result = []n = 0for t in triangles():result.append(t)n = n + 1if n == numRows:breakreturn result
但是奇怪的是,我將這個程序通過leetcode進行提交,卻得到了超時的錯誤,按理說使用生成器進行操作應該是更快才是,但是反而慢了?不得其解,如果有了解的同學歡迎告知。
解法三:數學公式
運用楊輝三角的公式:第n行第m個數可表示為C(n-1,m-1) = (n - 1)!/(m - 1)!*(n - m - 2)!
from math import factorial as f def generate(num_rows):res = [[] for _ in range(numRows)] if not numRows: return [] for i in range(numRows): for j in range(i + 1): res[i].append(f(i)//(f(j)*f(i - j)))return res
在python中如果利用足夠的python特性可以一行程序解決這個問題:
def generate(num_rows):return [[comb(i,j) for j in range(i+1)] for i in range(numRows)]
其中comb函數是python3.8 新引入的特性,主要是為了計算C(n, m),也就是從n中取出m個數的概率
總結
以上是生活随笔為你收集整理的用python实现杨辉三角的几种不同方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jieba词性说明字典
- 下一篇: 那些年值得铭记的时刻