这两个函数给出相同的结果,但是为什么循环中有“ 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);
}
}
答案 0 :(得分:2)
对于All
输入,它们不会执行相同的操作,但是对于某些输入,它们会执行相同的操作。
基本上,这里最大的危险标志是在recursion
函数中,您甚至没有在执行size
和translate
之前检查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);
对于相同的行为,需要进行一致的检查。