javascript - 如何通过将数字相乘来递归地减少数字?
问题描述
现在,我们有了这个递归函数:
function digitsMultipication(number) {
let strNumber = number.toString();
let firstNum = parseInt(strNumber[0]);
if(strNumber.length==1){
return firstNum
}else{
let x = ''
for(i=1;i<strNumber.length;i++){
x += strNumber[i]
}
x = parseInt(x)
return firstNum * digitsMultipication(x);
}
}
// TEST CASES
console.log(digitsMultipication(66)); // 36
我们如何编辑此函数,因为我们希望输出条件实际上是一位数。因为 36 仍然是 2 位,我们希望函数再次递归,直到输出为一位,即 8。
66 => 6 * 6 = 36,
36 => 3 * 6 = 18,
18 => 1 * 8 = 8(想要的最终输出)
解决方案
你的意思是这样的吗?
const
get = num => {
const sum = [...num + ''].reduce((sum, n) => n * sum);
return sum < 10 ? sum : get(sum);
},
result = get(66);
console.log(result);
一种更有效的方法是避免字符串化,并且只使用数学:
const
get = num => {
let sum = 1;
while (num) {
sum *= num % 10;
num = parseInt(num / 10);
}
return sum < 10 ? sum : get(sum);
},
result = get(66);
console.log(result);
甚至可以节省内存并避免递归:
const
get = num => {
let sum = 1;
for (;;) {
sum *= num % 10;
num = parseInt(num / 10);
if (num <= 0) {
if (sum < 10) return sum;
num = sum;
sum = 1;
}
}
},
result = get(66);
console.log(result);
推荐阅读
- php - 此路由不支持 GET 方法。支持的方法:PUT。学生
- github - Github 不允许我使用用户名和密码登录
- sharepoint - 当共享点文件夹中的文件被修改时,更新共享点列表
- php - 如果产品属于特定类别,则隐藏元素
- android - 如何检查 Android 应用程序是在前台、后台运行还是被杀死?(API 级别 27+)
- html - 是不是这个 HTML 中的问题导致 FF 和 Chrome 以不同的方式呈现这个“垂直对齐:基线”?
- php - 在 php 中使用 ldap_modify_batch() 时“é”变成“ã©”
- python - 在网站上查找单词并获取其页面链接
- haar-classifier - haarcascade 的图像收集
- r - 如何使用 dplyr 过滤数据框并选择坐标