def recursiveAddCards(cards):
    print("In:", cards)
    if cards == [ ]:
        print("Out:", 0)
        return 0
    else:
        smallerProblem = cards[1:]
        smallerResult = recursiveAddCards(smallerProblem)
        print("Out:", cards[0] + smallerResult)
        return cards[0] + smallerResult

print("Result:", recursiveAddCards([5, 2, 7, 3]))

###

def factorial(x):
    if x == 1: # base case is the smallest value
        return 1 # something that isn't recursive
    else:
        smallerProblem = x-1 # make the problem smaller
        smallerResult = factorial(smallerProblem)
        return x * smallerResult # solve using leftover part & smallerResult

print(factorial(5))
#print(factorial(-5))

###

def countVowels(s):
    if s == "": # base case
        return 0
    else: # recursive case
        smaller = countVowels(s[1:])
        if s[0] in "aeiou":
            return smaller + 1
        else:
            return smaller
        
print(countVowels("apple"))
print(countVowels("kpple"))

###

def removeDuplicates(lst):
    if lst == []: # base case
        return []
    else: # recursive case
        smaller = removeDuplicates(lst[1:])
        if lst[0] not in smaller:
            return smaller + [ lst[0] ]
        else:
            return smaller

print(removeDuplicates([1, 2, 1, 2, 3, 4, 3, 3]))