【问题标题】:What would be an example of the function working with an array of arrays with some logic?使用具有某种逻辑的数组数组的函数的示例是什么?
【发布时间】: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


【解决方案1】:

我使用了将其余数组组合成一个数组进行比较的逻辑,这也减少了我需要编写的逻辑。

function traverseForMyNumber(){
  var myNumber = 1;
  var tmp = 0;
  var input = [ [ 4, 5 ],
      [ 3, 2, 8, 7, 1, 10 ],
      [ 9, 4, 8, 50 ],
      [ 10, 20, 30] 
    ];
 for(var i = 0; i< input.length; i++){
   var copyArray = input.slice();
   var tempArray  = copyArray.splice(i, 1);

   //Concat rest of the arrays into single arary for easy traversal
   copyArray = [].concat.apply([], copyArray);

   //Logic for incrementing tmp
   for(var j = 0; j< tempArray[0].length; j++){
     for(var k = 0; k < copyArray.length; k++){
       if(test(tempArray[0][j],copyArray[k])){
         tmp++;
         if(tmp === myNumber) return true;
       }
     }
   }
 }
}

function test(a, b) {
  return a === b;
}

traverseForMyNumber();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    相关资源
    最近更新 更多