【发布时间】:2017-02-13 09:39:34
【问题描述】:
我有一个带有两个参数的函数,例如,
function test(a, b) {
if (a == b) return true;
return false;
};
我想要的是有一个函数func(arg) 默认返回false。它需要一个参数,这个参数将是一个数组数组。该函数的每个实例都将以一些动态生成的数字(整数)开始,我们称它为myNumber,假设它只是一个从 0 到 10 的随机整数。这个函数应该执行以下操作:
var myNumber = randomIntegerFrom0To10;
var tmp = 0;
test(arg[0][0], arg[1][0]);
test(arg[0][0], arg[1][1]);
test(arg[0][0], arg[1][2]);
...
一旦test(...) 返回true,设置tmp++ 并转到
test(arg[0][1], arg[1][0]);
test(arg[0][1], arg[1][1]);
test(arg[0][1], arg[1][2]);
....
一旦test(...) 返回true,设置tmp++ 并转到
test(arg[0][2], arg[1][0]);
test(arg[0][2], arg[1][1]);
test(arg[0][2], arg[1][2]);
...
...以此类推,直到
test(arg[0][arg[0].length-1], arg[1][0]);
test(arg[0][arg[0].length-1], arg[1][1]);
test(arg[0][arg[0].length-1], arg[1][2]);
...
——一如既往,只要test(...)返回true,就设置tmp++,但是在test(arg[0][arg[0].length-1], arg[1][arg[1].length-1])之后,我们必须检查tmp是否等于myNumber。如果是,该函数应返回true 并停止;但如果不是,我们必须继续(注意我们总是在每次与myNumber比较之后设置tmp = 0):
tmp = 0;
test(arg[0][0], arg[2][0]);
test(arg[0][0], arg[2][1]);
test(arg[0][0], arg[2][2]);
...
一旦test(...) 返回true,设置tmp++ ... 等等。如果我们永远不会看到tmp 等于myNumber,我们最终会来到
test(arg[0][0], arg[arg.length-1][0]);
test(arg[0][0], arg[arg.length-1][1]);
test(arg[0][0], arg[arg.length-1][2]);
继续上述逻辑。这里最长的路将是去
test(arg[0][(arg[0].length-1)], arg[arg.length-1][(arg[arg.length-1].length-1)]);
并检查当前的tmp。如果等于myNumber,函数应该返回true并停止,如果不是,我们必须继续:
tmp = 0;
test(arg[1][0], arg[2][0]);
test(arg[1][0], arg[2][1]);
test(arg[1][0], arg[2][2]);
...
...继续直到
test(arg[1][(arg[1].length-1)], arg[arg.length-1][(arg[arg.length-1].length-1)]);
并检查当前的tmp。与往常一样,要么返回true,要么继续:
tmp = 0;
test(arg[2][0], arg[2][0]);
test(arg[2][0], arg[2][1]);
test(arg[2][0], arg[2][2]);
...等等。理论上最长的方法是去
test(arg[arg.length-2][(arg[arg.length-2].length-1)],
arg[arg.length-1][(arg[arg.length-1].length-1)]);
并且,如果当前tmp 等于myNumber,则返回true。否则,返回false 最后停止。
例子:
var myNumber = 1;
var tmp = 0;
var input1 = [ [ 4, 5 ],
[ 3, 2, 8, 7, 1, 10 ],
[ 9, 4, 8, 50 ],
[ 10, 20, 30]
];
// 4 !== 3; tmp == 0;
// 4 !== 2; tmp == 0;
// 4 !== 8; tmp == 0;
// ...4 !== 10 ; tmp == 0;
// 5 !== 3 ; tmp == 0;
// 5 !== 2 ; tmp == 0;
// ...5 !== 10 ; tmp == 0; is the current tmp equal to myNumber? No. So, continue:
// 3 !== 9 ; tmp == 0;
// 3 !== 4 ; tmp == 0;
// 3 !== 8 ; tmp == 0;
// 3 !== 50 ; tmp == 0;
// 2 !== 9 ; tmp == 0;
// ...2 !== 50 ; tmp == 0;
// 8 !== 9 ; tmp == 0;
// 8 !== 4 ; tmp == 0;
// test(8,8) returns true; set tmp++ and, since there is no need for test(8,50), go to
// 7 !== 9 ; tmp == 1;
// ...7 !== 50 ; tmp == 1;
// 1 !== 9 ; tmp == 1;
// ...10 !== 50; tmp == 1; is the current tmp equal to myNumber? Yes.
// So, return true and stop.
如果我们有这样的输入:
var input2 = [ [ 1, 2 ],
[ 3, 4, 5, 6, 7, 8 ],
[ 9, 10, 11, 12 ],
[ 13, 14, 15]
];
那么我们将不得不执行尽可能多的“测试”操作并在test(12,15 之后返回false)。
问题是:任何工作函数的示例是什么,这样,按照上述逻辑,将执行为两个给定输入示例描述的操作:func(input1) 和func(input2)?
【问题讨论】:
-
您的问题是什么?顺便说一句,
if (a == b) return true; return false;完全等同于写return a == b;。 -
编辑了问题及其标题,添加了问题本身。我只需要这样的函数的任何示例,仅此而已。
标签: javascript arrays recursion sub-array