In [ ]:
import math

class Rational:
    """
    Represents a rational number bits (integer) numerator and denominator, reduced.
    """
    num: int
    den: int
    
    def __init__(self, num: int, den: int) -> None:
        gcd = math.gcd(num, den)
        self.num = num // gcd
        self.den = den // gcd
        
    def __repr__(self) -> str:
        return f"{self.num}/{self.den}"
    
    def __add__(self, y):
        den = self.den * y.den
        num1 = self.num * y.den
        num2 = y.num * self.den
        return Rational(num1 + num2, den)
    
    def __sub__(self, y):
        return self + Rational(-y.num, y.den)
    
    def __mul__(self, y):
        return Rational(self.num * y.num, self.den * y.den)
    
    def __truediv__(self, y):
        return self * Rational(y.den, y.num)
    
    def toFloat(self) -> float:
        return self.num / self.den
    
print((Rational(1, 4) / Rational(1, 3)).toFloat())
0.75
In [ ]:
def silly(x: int) -> int:
    print(f"silly of {x} started")
    if x < 0:
        print(f"silly of {x} (x < 0)")
        return 24
    else:
        print(f"silly of {x} calling silly({x-1})")
        r = silly(x-1)
        print(f"silly of {x} finished calling silly({x-1})")
        return r

print(silly(42))
silly of 42 started
silly of 42 calling silly(41)
silly of 41 started
silly of 41 calling silly(40)
silly of 40 started
silly of 40 calling silly(39)
silly of 39 started
silly of 39 calling silly(38)
silly of 38 started
silly of 38 calling silly(37)
silly of 37 started
silly of 37 calling silly(36)
silly of 36 started
silly of 36 calling silly(35)
silly of 35 started
silly of 35 calling silly(34)
silly of 34 started
silly of 34 calling silly(33)
silly of 33 started
silly of 33 calling silly(32)
silly of 32 started
silly of 32 calling silly(31)
silly of 31 started
silly of 31 calling silly(30)
silly of 30 started
silly of 30 calling silly(29)
silly of 29 started
silly of 29 calling silly(28)
silly of 28 started
silly of 28 calling silly(27)
silly of 27 started
silly of 27 calling silly(26)
silly of 26 started
silly of 26 calling silly(25)
silly of 25 started
silly of 25 calling silly(24)
silly of 24 started
silly of 24 calling silly(23)
silly of 23 started
silly of 23 calling silly(22)
silly of 22 started
silly of 22 calling silly(21)
silly of 21 started
silly of 21 calling silly(20)
silly of 20 started
silly of 20 calling silly(19)
silly of 19 started
silly of 19 calling silly(18)
silly of 18 started
silly of 18 calling silly(17)
silly of 17 started
silly of 17 calling silly(16)
silly of 16 started
silly of 16 calling silly(15)
silly of 15 started
silly of 15 calling silly(14)
silly of 14 started
silly of 14 calling silly(13)
silly of 13 started
silly of 13 calling silly(12)
silly of 12 started
silly of 12 calling silly(11)
silly of 11 started
silly of 11 calling silly(10)
silly of 10 started
silly of 10 calling silly(9)
silly of 9 started
silly of 9 calling silly(8)
silly of 8 started
silly of 8 calling silly(7)
silly of 7 started
silly of 7 calling silly(6)
silly of 6 started
silly of 6 calling silly(5)
silly of 5 started
silly of 5 calling silly(4)
silly of 4 started
silly of 4 calling silly(3)
silly of 3 started
silly of 3 calling silly(2)
silly of 2 started
silly of 2 calling silly(1)
silly of 1 started
silly of 1 calling silly(0)
silly of 0 started
silly of 0 calling silly(-1)
silly of -1 started
silly of -1 (x < 0)
silly of 0 finished calling silly(-1)
silly of 1 finished calling silly(0)
silly of 2 finished calling silly(1)
silly of 3 finished calling silly(2)
silly of 4 finished calling silly(3)
silly of 5 finished calling silly(4)
silly of 6 finished calling silly(5)
silly of 7 finished calling silly(6)
silly of 8 finished calling silly(7)
silly of 9 finished calling silly(8)
silly of 10 finished calling silly(9)
silly of 11 finished calling silly(10)
silly of 12 finished calling silly(11)
silly of 13 finished calling silly(12)
silly of 14 finished calling silly(13)
silly of 15 finished calling silly(14)
silly of 16 finished calling silly(15)
silly of 17 finished calling silly(16)
silly of 18 finished calling silly(17)
silly of 19 finished calling silly(18)
silly of 20 finished calling silly(19)
silly of 21 finished calling silly(20)
silly of 22 finished calling silly(21)
silly of 23 finished calling silly(22)
silly of 24 finished calling silly(23)
silly of 25 finished calling silly(24)
silly of 26 finished calling silly(25)
silly of 27 finished calling silly(26)
silly of 28 finished calling silly(27)
silly of 29 finished calling silly(28)
silly of 30 finished calling silly(29)
silly of 31 finished calling silly(30)
silly of 32 finished calling silly(31)
silly of 33 finished calling silly(32)
silly of 34 finished calling silly(33)
silly of 35 finished calling silly(34)
silly of 36 finished calling silly(35)
silly of 37 finished calling silly(36)
silly of 38 finished calling silly(37)
silly of 39 finished calling silly(38)
silly of 40 finished calling silly(39)
silly of 41 finished calling silly(40)
silly of 42 finished calling silly(41)
24
In [ ]:
def factorial(n: int) -> int:
    print(f"factorial({n}) started")
    if n <= 1:
        print(f"factorial({n}) returning 1")
        return 1
    else:
        print(f"factorial({n}) recursive case starting")
        r = n * factorial(n-1)
        print(f"factorial({n}) recursive case ending")
        return r
    
print(factorial(5))
factorial(5) started
factorial(5) recursive case starting
factorial(4) started
factorial(4) recursive case starting
factorial(3) started
factorial(3) recursive case starting
factorial(2) started
factorial(2) recursive case starting
factorial(1) started
factorial(1) returning 1
factorial(2) recursive case ending
factorial(3) recursive case ending
factorial(4) recursive case ending
factorial(5) recursive case ending
120
In [ ]:
def factorial(n: int) -> int:
    r = 1
    for i in range(n, 1, -1):
        r *= i
    return r

print(factorial(5))
120
In [ ]:
def fib(n: int) -> int:
    print(f"Fibonacci {n} starting")
    if n <= 1:
        print(f"Fibonacci {n} base case")
        return n
    else:
        print(f"Fibonacci {n} recursive case starting")
        r = fib(n-1) + fib(n-2)
        print(f"Fibonacci {n} recursive case ending")
        return r
    
#print(fib(0), fib(1), fib(2), fib(3), fib(4), fib(5), fib(6))
print(fib(3))
Fibonacci 3 starting
Fibonacci 3 recursive case starting
Fibonacci 2 starting
Fibonacci 2 recursive case starting
Fibonacci 1 starting
Fibonacci 1 base case
Fibonacci 0 starting
Fibonacci 0 base case
Fibonacci 2 recursive case ending
Fibonacci 1 starting
Fibonacci 1 base case
Fibonacci 3 recursive case ending
2
In [ ]:
import typing

l = [2, 4, 6, 0, 1]
print(6 in l)

def contains(lst: list, needle: typing.Any) -> bool:
    for val in lst:
        if val == needle:
            return True
    return False

print(contains(l, 6))
True
True