一个数每次乘以3,乘几次会超过100

let count = 0;
function add(num){
    if(num >= 100){
        return count;
    }else{
        count++;
        add(num*3)
    }
    return count;
}
let ADD = add;
console.log(ADD(1.2));

这是我目前写的,有尝试过把count声明放进add里面去,用闭包去写,但是我写的闭包的形式的返回值是undefined,还有为什么要两次抛出count才行,如果只是判断通过的那一次抛出count的话,返回值是undefined

想请教一下,如果把声明count放进add里面去,该怎么操作

阅读 3.1k
5 个回答

用while或者递归比较好。

function mult (val) {
    let count = 0
    if (val <= 0) {
        return Infinity
    }
    while (val <= 100) {
        val *= 3
        count++
    }
    return count
}

一个数学问题要这么复杂?

function add(num)
{
    return parseInt(Math.log(100 / num) / Math.log(3)) + 1;
}

1.你没写错,返回值是正常的

clipboard.png

2.改成这样就好啦

let count = 0;
function add(num){
    if(num >= 100){
        return count;
    }else{
        count++;
        return add(num*3)
    }
}

你把思路换成log3(100/x)向上取整不就好了。从除法的角度来做。

你可以再往外包一层函数,这样结束的时候闭包也释放了。

用数学处理比较简单的,基本思路 3^n * x > 100 => n > log3(100/x) => n > ln(100/x) / ln(3)

一些边界条件需要注意。

function add (num) {
  if (typeof num !== 'number' || num <= 0) {
      return false
     }
     if (num >= 100) {
         return 0
     }
     const result = Math.ceil(Math.log(100 / num) / Math.log(3))
  return result <= Number.MAX_VALUE ? result : false
    }

console.assert(add(0.1) === 7, 0.1)
console.assert(add(1) === 5, 5)
console.assert(add(10) === 3, 3)
console.assert(add(99) === 1, 1)
console.assert(add(100) === 0, 100)
console.assert(add(101) === 0, 101)
console.assert(add(Number.MAX_SAFE_INTEGER) === 0, 'Number.MAX_SAFE_INTEGER')
console.assert(add(Number.MAX_SAFE_INTEGER + 1) === 0)
console.assert(add(Number.MAX_VALUE) === 0)
console.assert(add(Number.MAX_VALUE + 1) === 0)
console.assert(add(Infinity) === 0)
console.assert(add(-Infinity) === false)
console.assert(add(Number.MIN_SAFE_INTEGER) === false)
console.assert(add(Number.MIN_SAFE_INTEGER - 1) === false)
console.assert(add(Number.MIN_VALUE) === false)
console.assert(add(Number.MIN_VALUE - 1) === false, 'Number.MIN_VALUE - 1')
console.assert(add(-1) === false)
console.assert(add(0) === false)
console.assert(add(true) === false)
console.assert(add(NaN) === false)
console.assert(add('') === false)
console.assert(add({}) === false)
console.assert(add() === false)
推荐问题