我如何使用名为 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
}
答案 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