循环和递归:重复次数的差异

时间:2019-12-19 09:14:11

标签: javascript loops recursion

这两个函数给出相同的结果,但是为什么循环中有“ i> 4 ”而递归中有“ size> 5 ”?为什么数字不同?

function branchBoxForLoop(size) {
  c.strokeStyle = "blue";
  for (var i = size; i > 4; i = i * 0.65) {
    c.translate(i, i);
    c.strokeRect(-i, -i, i, i);
  }
}
function branchBox(size) {
  c.translate(size, size);
  c.strokeRect(-size, -size, size, size);
  if (size > 5) {
    branchBox(size * 0.65);
  }
}

3 个答案:

答案 0 :(得分:2)

对于All输入,它们不会执行相同的操作,但是对于某些输入,它们会执行相同的操作。

基本上,这里最大的危险标志是在recursion函数中,您甚至没有在执行sizetranslate之前检查strokeRect,这意味着它总是至少运行一次。

匹配的递归函数将是这样的(忽略c.strokeStyle = "blue"):

function branchBox(size) {
  if (size > 4) {
    c.translate(size, size);
    c.strokeRect(-size, -size, size, size);
    branchBox(size * 0.65);
  }
}

答案 1 :(得分:1)

我提供了一种方法来批量测试两个函数之间的匹配和不匹配:

var c = {
    translate: () => {
        // console.log('translate arguments', arguments)
    },

    strokeRect: () => {
        // console.log('strokeRect arguments', arguments)
    }
}

function* branchBoxForLoop(size) {
  c.strokeStyle = "blue";
  for (var i = size; i > 4; i = i * 0.65) {
    c.translate(i, i);
    c.strokeRect(-i, -i, i, i);
    yield i;
  }
}
function* branchBox (size) {
  c.translate(size, size);
  c.strokeRect(-size, -size, size, size);
  yield size;
  if (size > 5) {
    yield* branchBox(size * 0.65);
  }
}

var matches = [];
var mismatches = [];
for (let x = 5; x < 100; x += 0.2) {
  x = x.toFixed(2);
  x = Number(x);
  let a = [...branchBoxForLoop(x)];
  let b = [...branchBox(x)];
  if (JSON.stringify(a) == JSON.stringify(b)) {
    matches.push(x);
  } else {
    mismatches.push(x);
  }
}

console.log(mismatches);

[edit]模式通常是这样

这两个函数对于

的行为有所不同

(a)大于5的每个值,当您将其乘以0.65时,会生成小于5的值

(b)并且,如果您从a中获取所有这些值并乘以(1 / 0.65),那么所有这些值的行为也将不同

(c)如果您从b中获取所有这些值并乘以(1 / 0.65),那么所有这些值的行为也将有所不同

无限等等

答案 2 :(得分:0)

实际上,当输入大小= 4时,它们两者都会导致结果不同;代码执行如下。

// branchBoxForLoop(4)
c.strokeStyle = "blue";


// branchBox(4)
c.translate(4, 4);
c.strokeRect(-4, -4, 4, 4);

对于相同的行为,需要进行一致的检查。