JuliaでProject Euler(17)

Problem 17

https://projecteuler.net/problem=17

何度も解いているが、一度も最初で正しい答えを出した記憶がない。
できるだけ再帰を使う。

function e017(N)
    function num_length(n)
        if haskey(num_letters, n) && n < 100
            return length(num_letters[n])
        elseif n < 100
            d = n%10
            return num_length(n-d) + num_length(d)
        elseif n < 1000
            d = div(n, 100)
            r = n%100
            if r == 0
                return num_length(d) + length(num_letters[100])
            else
                return num_length(d*100) + 3 + num_length(r)
            end
        else
            d = div(n, 1000)
            r = n%1000
            if r == 0
                return num_length(d) + length(num_letters[1000])
            else
                return num_length(d*1000) + 3 + num_length(r)
            end
        end
    end
    
    num_letters = Dict(
        0 => "", 1 => "one", 2 => "two", 3 => "three", 4 => "four", 5 => "five",
        ...
    )
    
    return sum(num_length(n) for n in 1:N)
end

N = parse(Int, ARGS[1])
println(e017(N))