计算基础因子

时间:2017-02-07 16:53:04

标签: javascript algorithm

我如何使用名为 unfactorial 的函数来获取一个数字并返回一个表示它的基本阶乘的字符串:n!?如果可能的话,这将导致不执行因子操作。如果没有可能的因子,它应该返回 null

封装
阶乘操作如下所示:

  

5! = 5 * 4 * 3 * 2 * 1 = 120

功能输出:

unfactorial(120) // '5!'
unfactorial(150) // null
unfactorial(5040) // '7!'

我目前的解决方案

    const unfactorial = (num) => {
      let d = 1
      while (num > 1 && Math.round(num === num)) {
        d += 1
        num /= d
      }
      if (num === 1)
        return `${d}!`
      else return null
    }

1 个答案:

答案 0 :(得分:1)

这是使用辅助递归函数的一种方法。

注意,它不适用于非实际阶乘的数字。这留给了提问者。



const unfactorial = x => {
  const aux = (acc, x) => {
    if (x === 1)
      return acc - 1
    else
      return aux(acc + 1, x / acc)
  }
  return aux(2, x)
}

console.log(unfactorial(120))  // 5
console.log(unfactorial(5040)) // 7




工作原理

从输入数字x和计数器acc = 2开始,依次将x除以acc(然后acc + 1,然后acc + 2等等,直到x == 1。然后返回acc - 1

或者只使用表达式去香蕉。你可能会喜欢这个,@ Mr.Polywhirl



const U = f => f (f)

const Y = U (h => f => f (x => h (h) (f) (x)))

const unfactorial = Y (f => acc => x =>
  x === 1 ? acc - 1 : f (acc + 1) (x / acc)
) (2)

console.log(unfactorial(120))  // 5
console.log(unfactorial(5040)) // 7