[+] Finish Prep3
This commit is contained in:
@@ -0,0 +1,160 @@
|
||||
"""CSC111 Winter 2022 Prep 3: Programming Exercises
|
||||
|
||||
Instructions (READ THIS FIRST!)
|
||||
===============================
|
||||
|
||||
This Python module contains a few functions that you should implement.
|
||||
Each function represents a recursively-defined mathematical function,
|
||||
corresponding to one in the starter file prep3_functions.pdf.
|
||||
(You do not need to modify or submit prep3_functions.pdf, but you'll
|
||||
need to read it to complete this programming exercise.)
|
||||
|
||||
We have marked each place you need to write code with the word "TODO".
|
||||
As you complete your work in this file, delete each TODO comment.
|
||||
|
||||
You do not need to add additional doctests. However, you should test your work carefully
|
||||
before submitting it!
|
||||
|
||||
Copyright and Usage Information
|
||||
===============================
|
||||
|
||||
This file is provided solely for the personal and private use of students
|
||||
taking CSC111 at the University of Toronto St. George campus. All forms of
|
||||
distribution of this code, whether as given or with any changes, are
|
||||
expressly prohibited. For more information on copyright for CSC111 materials,
|
||||
please consult our Course Syllabus.
|
||||
|
||||
This file is Copyright (c) 2022 Mario Badr and David Liu.
|
||||
"""
|
||||
|
||||
|
||||
def formula(n: int) -> float:
|
||||
"""Return the value given by Definition 1 in prep3_functions.py.
|
||||
|
||||
Preconditions:
|
||||
- n >= 0
|
||||
|
||||
>>> formula(0)
|
||||
4.0
|
||||
>>> formula(1) == 4 - 4/3
|
||||
True
|
||||
>>> formula(2) == 4 - 4/3 + 4/5
|
||||
True
|
||||
"""
|
||||
if n == 0:
|
||||
return 4.0
|
||||
elif n > 0:
|
||||
return formula(n - 1) + ((4 * (-1) ** n) / (2 * n + 1))
|
||||
else:
|
||||
raise ValueError(f'Precondition n >= 0 is violated. (n = {n})')
|
||||
|
||||
|
||||
def formula_multiple_args(n: int, a: float, b: float) -> float:
|
||||
"""Return the value given by Definition 2 in prep3_functions.py.
|
||||
|
||||
Preconditions:
|
||||
- n >= 0
|
||||
|
||||
>>> formula_multiple_args(0, -1, -1)
|
||||
0.0
|
||||
>>> formula_multiple_args(1, 3, 2)
|
||||
2.0
|
||||
"""
|
||||
if n == 0:
|
||||
return 0.0
|
||||
elif n > 0:
|
||||
return a * formula_multiple_args(n - 1, a, b) + b
|
||||
else:
|
||||
raise ValueError(f'Precondition n >= 0 is violated. (n = {n})')
|
||||
|
||||
|
||||
def formula_double_recursion(n: int, m: int) -> int:
|
||||
"""Return the value given by Definition 3 in prep3_functions.py.
|
||||
|
||||
Preconditions:
|
||||
- n >= 0
|
||||
- m >= 0
|
||||
|
||||
>>> formula_double_recursion(0, 155)
|
||||
155
|
||||
>>> formula_double_recursion(1, 1) == 3 + (2 * 1)
|
||||
True
|
||||
"""
|
||||
if n == 0:
|
||||
return m
|
||||
elif n > 0:
|
||||
if m == 0:
|
||||
return 2 * formula_double_recursion(n - 1, n)
|
||||
elif m > 0:
|
||||
return 3 + formula_double_recursion(n, m - 1)
|
||||
else:
|
||||
raise ValueError(f'Precondition m >= 0 is violated. (m = {m})')
|
||||
else:
|
||||
raise ValueError(f'Precondition n >= 0 is violated. (n = {n})')
|
||||
|
||||
|
||||
# Note: the type annotation list[int] requires that you have Python 3.9 installed!
|
||||
# If you haven't upgraded already, now is an excellent time to do so (check the
|
||||
# "Software Installation/Upgrading Instructions" page on Quercus).
|
||||
def create_list1(n: int) -> list[int]:
|
||||
"""Return the value given by Definition 4 in prep3_functions.py.
|
||||
|
||||
Preconditions:
|
||||
- n >= 0
|
||||
|
||||
>>> create_list1(0)
|
||||
[0]
|
||||
>>> create_list1(1)
|
||||
[0, 0, 1]
|
||||
>>> create_list1(2)
|
||||
[0, 0, 1, 0, 0, 1, 2]
|
||||
"""
|
||||
if n == 0:
|
||||
return [0]
|
||||
elif n > 0:
|
||||
return 2 * create_list1(n - 1) + [n]
|
||||
else:
|
||||
raise ValueError(f'Precondition n >= 0 is violated. (n = {n})')
|
||||
|
||||
|
||||
def create_list2(n: int, m: int) -> list:
|
||||
"""Return the value given by Definition 5 in prep3_functions.py.
|
||||
|
||||
Preconditions:
|
||||
- n >= 0
|
||||
- m >= 0
|
||||
|
||||
TESTING NOTE: because this function makes two recursive calls instead of
|
||||
just one, it will be a lot slower than your other functions!
|
||||
We recommend testing your work with very small numbers, e.g. m, n <= 5.
|
||||
|
||||
>>> create_list2(0, 155)
|
||||
[155]
|
||||
>>> create_list2(155, 0)
|
||||
[155]
|
||||
>>> create_list2(1, 1)
|
||||
[[1], [1]]
|
||||
>>> create_list2(2, 2)
|
||||
[[[2], [[1], [1]]], [[[1], [1]], [2]]]
|
||||
"""
|
||||
if n == 0:
|
||||
return [m]
|
||||
elif m == 0:
|
||||
return [n]
|
||||
elif n > 0 and m > 0:
|
||||
return [create_list2(n - 1, m), create_list2(n, m - 1)]
|
||||
else:
|
||||
raise ValueError(f'Precondition (n >= 0 and m >= 0) is violated. (n = {n}, m = {m})')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
import python_ta.contracts
|
||||
python_ta.contracts.check_all_contracts()
|
||||
|
||||
import doctest
|
||||
doctest.testmod()
|
||||
|
||||
import python_ta
|
||||
python_ta.check_all(config={
|
||||
'max-line-length': 100
|
||||
})
|
||||
Binary file not shown.
Reference in New Issue
Block a user