Pascal's triangle is a simple and effective way to expand a set of brackets in the form (a + b)ⁿ.
In my code the user is asked an input for what order (n) they want and it outputs Pascal's triangle.
The Code
I added in comments to help you understand my reasoning.
def get_super(x): # function to get superscript char.
normal = "0123456789"
super_s = "⁰¹²³⁴⁵⁶⁷⁸⁹"
res = x.maketrans(''.join(normal), ''.join(super_s))
return x.translate(res)
# the history_variable will be the variable returned when function is called. It will contain each co-efficient of every row.
# the number of rows that the history_variable returns is provided by parameters(num)
# I created save_variable as a variable I can use to store the previous row because I need it to create the next row.
# current_variable is a variable that will contain the current row being made.
def basic_pascals(num):
history_variable = [[1], [1, 1]]
save_variable = [1, 1]
current_variable = []
amount = 0
# if the number given is 0 just return 1 as that is the first row.
if num == 0:
return([1])
# if the number given is 1 return [1, 1] as those are the coefficients of (a+b)
elif num == 1:
return([1, 1])
# otherwise we create a for loop that will loop through num-1 iterations - I of every loop here as the making of one row
# in that loop we create a for loop over the save_variable and save_variable[1:] which will let us loop through every possible pair.
# the reason I do this is because each co-efficient in the new row is equal to the addition of the two co_efficients directly above it in the previous row.
# I then add every sum of every pair to the current-variable.
# add 1 to the start and end and then I have the co-efficients of the row.
# equate save_variable to current_variable
# then append save_variable to history_variable
# it repeats itself and finally history_variable is a list of lists each list containing the co-efficients of every row.
for i in range(num-1):
for item in zip(save_variable, save_variable[1:]):
amount += sum(item)
current_variable.append(amount)
amount = 0
current_variable.append(1)
current_variable.insert(0, 1)
save_variable = current_variable
current_variable = []
history_variable.append(save_variable)
return history_variable
# this is essentially adding the a's and b's to the co-efficients
# specify the order you want and if the order == 0 or 1 then it just prints out 1 or (1a + 1b)
# otherwise we make variable co-efficients and call basic_pascals to it.
# power a will equal the highest power possible depending on the order of the row, i.
# power b will equal 0. As you move through every term in a row, the power in a decreases and b increases
# rest is forming f"string" to add it to the co-efficients
def pascals_triangle():
# the n value of (a+b)^n
order = int(input("Enter the order(n) you would like for (a+b)^n: "))
spacing = order*10
if order == 0:
print(1)
if order == 1:
print(f"a{get_super('1')} + b{get_super('1')}")
else:
co_efficients = basic_pascals(order)
for i, row in enumerate(co_efficients):
power_a = i
power_b = 0
result = f""
for item in row:
a = f"a{power_a}"
b = f"b{power_b}"
if i == 0:
result += f"{item}"
elif power_a == 0:
result += f"{item}{get_super(b)} + "
elif power_b == 0:
result += f"{item}{get_super(a)} + "
else:
result += f"{item}{get_super(a)}{get_super(b)} + "
power_a -= 1
power_b += 1
result = result.strip(" + ")
print(result.center(spacing))
pascals_triangle()
Output
Calling basic_pascals(8)
[[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]]
Calling pascals_triangle(8)
1
1a¹ + 1b¹
1a² + 2a¹b¹ + 1b²
1a³ + 3a²b¹ + 3a¹b² + 1b³
1a⁴ + 4a³b¹ + 6a²b² + 4a¹b³ + 1b⁴
1a⁵ + 5a⁴b¹ + 10a³b² + 10a²b³ + 5a¹b⁴ + 1b⁵
1a⁶ + 6a⁵b¹ + 15a⁴b² + 20a³b³ + 15a²b⁴ + 6a¹b⁵ + 1b⁶
1a⁷ + 7a⁶b¹ + 21a⁵b² + 35a⁴b³ + 35a³b⁴ + 21a²b⁵ + 7a¹b⁶ + 1b⁷
1a⁸ + 8a⁷b¹ + 28a⁶b² + 56a⁵b³ + 70a⁴b⁴ + 56a³b⁵ + 28a²b⁶ + 8a¹b⁷ + 1b⁸
Improvements
I want to make my code a bit more concise and easier to understand. I even have to think about why I do certain things sometimes.
math.comb(n,k)
. \$\endgroup\$