def factorial_iterative(n): """ Returns the factorial of n, iteratively """ num = 1 for i in range(2, n+1): num *= i # same as num = num * i return num def factorial_iterative2(n): """ Returns the factorial of n, iteratively """ num = 1 for i in range(n): num *= (i+1) # same as num = num * i return num def factorial(n): # check the base case if n == 1: return 1 else: # the recursive case return n * factorial(n-1) def rec_sum(n): if n == 0: return 0 else: return n + rec_sum(n-1) def rec_sum_list(some_list): if some_list == []: return 0 else: return some_list[0] + rec_sum_list(some_list[1:]) def rec_sum_list_print(some_list): print("Calling rec_sum_list: " + str(some_list)) if some_list == []: print("base case returning 0") return 0 else: answer = some_list[0] + rec_sum_list_print(some_list[1:]) print(str(some_list) + " returning " + str(answer)) return answer def reverse(some_string): """ Returns the reverse of the input string """ print("calling " + some_string) if some_string == "": print("return base ") return "" else: answer = reverse(some_string[1:]) + some_string[0] print("returning " + answer) return answer def power(base, exponent): """ Returns the base^exponent """ if exponent == 0: return 1 else: return base * power(base, exponent-1) def fast_power(base, exponent): """ Returns the base^exponent """ if exponent == 0: return 1 elif exponent % 2 == 0: # b^e = b^(e/2) * b^(e/2) temp = fast_power(base, exponent/2) return temp * temp else: return base * fast_power(base, exponent-1)