我做了一个 JS 练习,需要从一串数字创建一个回文。它有效,但我确信有一种更简洁的方法可以实现这一点。
来自 edabit.com 的方向:
A number may not be a palindrome, but it's descendant can be. A number's direct child is created by summing each pair of adjacent digits to create the digits of the next number. Create a function that returns true if the number itself is a palindrome or any of its descendants down to 2 digits
function palindromeDescendant(input) {
let newStr = input;
let newRevStr = (""+input).split('').reverse().join('');
checkEquality(newStr, newRevStr);
function checkEquality(a, b) {
if (a != b && (""+a).split('').length >= 2) {
sumPair(a);
} else if (a != b) {
result = `${false}: ${a}`;
} else {
result = `${true}: ${a}`;
}
}
function sumPair(nums) {
const a = (""+nums).split('').map(Number);
let b = [];
for (let i = 0; i < a.length -1; i++) {
b.push(a[i] + a[i + 1]);
i++
}
newStr = b.join('');
newRevStr = newStr.split('').reverse().join('');
checkEquality(newStr, newRevStr);
}
return result;
}
最佳答案
您的结果
是隐式全局的,这是不好的做法。当在严格模式下运行时,您的脚本会抛出错误
Uncaught ReferenceError: result is not defined
有很多地方使用 (""+value).split('')
,因此可以将其移至可重用函数中。
newStr
实际上最初是一个数字,而不是一个字符串。将不同类型重新分配给单个变量是不好的,原因有两个:它会让程序员在阅读代码时感到困惑,并且由于变量类型的不一致而导致代码的去优化。
您的 checkEquality()
并未执行其声称的操作。除了检查相等性之外,它还检查字符串形式的值的长度是否大于或等于 2。您应该确保在编写函数时,它们实际执行的操作与其名称所暗示的意图一致。
最后,您的 sumPair()
可以通过仅增加 for
语句中的 i
来提高可读性(这就是导致我最初对您的实现和有关“无限增长”的评论感到困惑)。
将所有这些放在一起,您可以编写如下所示的实现:
function toStringArray (value) {
return value.toString().split('');
}
function reverseString (value) {
return value.split('').reverse().join('');
}
function sumPairs (value) {
const array = toStringArray(value).map(Number);
const pairs = [];
for (let i = 0; i < array.length - 1; i += 2) {
pairs.push(array[i] + array[i + 1]);
}
return pairs.join('');
}
function palindromeDescendant (value) {
const forward = value.toString();
const reverse = reverseString(forward);
// this is only here to demonstrate recursion in output
console.log(forward);
if (forward === reverse) return true;
const descendant = sumPairs(value);
return descendant.length >= 2 && palindromeDescendant(descendant);
}
console.log(palindromeDescendant(11211230));
关于javascript - 检查此 Javascript 代码是否为 'DRY' 或效率低下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57436499/