Home Menu
Pipelines Pattern Matching
Learning Pattern Matching Pattern Matching Example
Add Pattern Recursion Data Types
Syntax Binary Trees
Iterators
First exposure Iterator chaining Iterator slicing Lazy Evaluation
Lazy Lists
In Python In Coconut
Recursive Factorial
Base Case Recursive Call Error Handling Wildcard Pattern Automatic Tail Call Optimization

Coconut-enabled Improvements: Wildcard Pattern

Now we have a functional factorial implementation:

def factorial(n):
    """Compute n! where n is an integer >= 0."""
    case n:
        match 0:
            return 1
        match x is int if x > 0:
            return x * factorial(x-1)
    else:
        raise TypeError("the argument to factorial must be an integer >= 0")

# Test cases:
-1 |> factorial |> print  # TypeError
0.5 |> factorial |> print  # TypeError
0 |> factorial |> print  # 1
3 |> factorial |> print  # 6

One easy improvement we can make to our factorial function is to make use of the wildcard pattern, _. We don't actually need to assign x as a new variable, since it has the same value as n, so if we use _ instead of x, Coconut won't ever actually assign the variable. Thus, we can rewrite our factorial function without using x.

Replace the first occurrence of x with the wildcard pattern, _, and all the other occurrences of x with n.

Run the code to make sure the test cases pass!

Show Solution:


Next
Previous

Coconut Editor

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Output

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX