Bell numbers calculation in C
Even without memoization, I cut the calculation time by about 40% when I switched from your version of binomial to the following:  

static uint64_t permute(uint8_t n, uint8_t k) {
    uint64_t result = 1;

    for (; n &gt; k; --n) {
        result *= n;
    }

    return result;
}

static inline uint64_t binomial(uint8_t n, uint8_t k) {
    if ( n - k &gt; k ) {
        return permute(n, n - k) / permute(k, 1);
    } else {
        return permute(n, k) / permute(n - k, 1);
    }
}


Note that you could use the ternary operator rather than the if in binomial.  

static inline uint64_t binomial(uint8_t n, uint8_t k) {
    return ( n - k &gt; k ) 
        ? permute(n, n - k) / permute(k, 1)
        : permute(n, k) / permute(n - k, 1);
}


I find the if easier to follow in a complex statement like that.  

The reason this works is that \$ \binom{n}{k} = \frac{n!}{k!(n-k)!}\$ can also be written as 

$$ \frac{n * (n-1) * ... * (k+1)*k!}{k!(n-k)!} = \frac{n * (n-1) * ... * (k+1)}{(n-k)!} $$

and replacing factorial(k) with permute(k, 1) works because 

$$ \frac{n!}{1!} = n! $$

It's unclear if memoization of the factorials would help more.  It may depend on how many values you need to calculate.