const time = f => {
    const s = Date.now()
    try {
        const res = f()
        console.log(`res: ${res}, time: ${Date.now() - s}`)
    } catch(ex) {
        console.log(`error: ${ex.toString()}, time: ${Date.now() - s}`)
    }
}
const fib1 = n =>
  n <= 1 ? n : fib1(n - 1) + fib1(n - 2)
time(_ => fib1(42))
const fib2 = (n) => {
    const go = (n, a, b) =>
      n === 0 ? b : go(n - 1, a + b, a)
    
    return go(n, 1, 0)
}
time(_ => fib2(42))
const sum1 = n =>
    n === 0 ? 0 : n + sum1(n - 1)
    
time(_ => sum1(100000))
const sum2 = n => {
    const go = (n, a) =>
        n === 0 ? a : go(n - 1, a + n)
    
    return go(n, 0)
}
    
time(_ => sum2(100000))