算法交替运动递归
algorithm alternating motion recursion
我如何设计一种算法来输入任意长度的数字数组并确定它们形成的函数是否代表交替运动?
例如,对于数组 [-3, -2, -4, 4, 2, 5, 0, 3, -10, 4],输出将为是,因为数字是从上到下向上排列的-向下-向上-向下-向上-向下-向上。对于数组 [3, -2, -4, 4, 5, 7, 10, 3, -10, 4] 输出将是 no 因为数字有时只下降 (3, -2, -4) 或只向上(-4、4、5、7、10)。
我只要算法。我不打算编写代码。
只取两个连续值之间的差值:差值的符号应该在数组的每次循环迭代中翻转:
function isUpDown(arr) {
if (arr.length < 3 || arr[0] === arr[1]) return false;
for (let i = 2, sign = Math.sign(arr[0] - arr[1]); i < arr.length; i++, sign = -sign) {
if (sign !== Math.sign(arr[i] - arr[i-1])) return false;
}
return true;
}
console.log(isUpDown([-3, -2, -4, 4, 2, 5, 0, 3, -10, 4])); // true
console.log(isUpDown([3, -2, -4, 4, 5, 7, 10, 3, -10, 4])); // false
我如何设计一种算法来输入任意长度的数字数组并确定它们形成的函数是否代表交替运动?
例如,对于数组 [-3, -2, -4, 4, 2, 5, 0, 3, -10, 4],输出将为是,因为数字是从上到下向上排列的-向下-向上-向下-向上-向下-向上。对于数组 [3, -2, -4, 4, 5, 7, 10, 3, -10, 4] 输出将是 no 因为数字有时只下降 (3, -2, -4) 或只向上(-4、4、5、7、10)。
我只要算法。我不打算编写代码。
只取两个连续值之间的差值:差值的符号应该在数组的每次循环迭代中翻转:
function isUpDown(arr) {
if (arr.length < 3 || arr[0] === arr[1]) return false;
for (let i = 2, sign = Math.sign(arr[0] - arr[1]); i < arr.length; i++, sign = -sign) {
if (sign !== Math.sign(arr[i] - arr[i-1])) return false;
}
return true;
}
console.log(isUpDown([-3, -2, -4, 4, 2, 5, 0, 3, -10, 4])); // true
console.log(isUpDown([3, -2, -4, 4, 5, 7, 10, 3, -10, 4])); // false