Left factorials

Built-in:

say 20.of { .left_factorial }

Straightforward:

func left_factorial(n) {
    ^n -> sum { _! }
}

Memory efficient with Range.reduce():

func left_factorial(n) {
    ^n -> reduce({ |a,b| a + b! }, 0)
}

A faster approach:

func left_factorial(n) {
    static cached    = 0
    static factorial = 1
    static leftfact  = 0

    if (n < cached) {
        cached    = 0
        factorial = 1
        leftfact  = 0
    }

    while (n > cached) {
        leftfact  += factorial
        factorial *= ++cached
    }

    leftfact
}

Completing the task:

Output:

Last updated

Was this helpful?