我正在做一个需要递归的问题,用于计算加起来一定金额的硬币组合。有效的解决方案如下。困扰我几个小时的一件事是,当我没有在for循环中声明var i = 0时,它不起作用。据我所知,当我在for循环中声明var时,它会保持在该范围内,就好像我不是它从全局中拉出来一样?有人可以向我解释为什么这个算法在jsfiddle.net上不起作用,除非我在for循环中声明var i = 0。感谢任何可以提供帮助的人。
var coins = [1, 2, 5, 10, 20, 50, 100];
var ways = 0;
function combo(index,amount) {
//if I write for(i=0;...;i++) it doesn't work
for (var i = 0; i <= Math.ceil(amount / coins[index]); i++) {
amountleft = amount - (i * coins[index]);
if (amount < 0) {
break;
}
if (amountleft == 0) {
ways ++;
break;
}
if (amountleft > 0) {
combo(index + 1,amountleft);
}
}
}
combo(0,50)
console.log(ways)
答案 0 :(得分:2)
是
你的假设是正确的。如果省略var
,则变量将是全局变量(或抛出错误,具体取决于您的浏览器)。
如果你的函数是递归的,那么当来自堆栈中不同位置的循环正在改变(并且依赖于迭代)相同的变量时,显然会有干扰。
答案 1 :(得分:0)
它的作用域不是for-loop块。有些人把它放在外面。它两种方式都有同样的效果。
var i = 0;
for (; i<foo.length; i++) {
}
在es5中声明变量时,应始终使用var
。值得一读的是它的范围(提示:通常是它声明的函数)。在es6中,我们有let
,它的范围是它声明的块(在这种情况下是for循环)
答案 2 :(得分:0)
因为在javascript中你必须在你想要使用它之前明确声明你的变量。所以,如果你写
for(i=0;...;i++)
变量i
来自何处? Javascript会抛出错误:Uncaught ReferenceError: i is not defined
答案 3 :(得分:0)
是的,当然它不会工作,sql injection
是可变的,必须进行初始化。
是的,你可以在外面声明它循环。但我认为你已经在功能之外宣布它不起作用。
Cursor cur = db.query(dbHelper.TABLENAME, columns, columns[1]+" = ?", new String[]{"ali"}, null, null, null);