0

我是 JS 函数和对象的新手,我正在尝试迭代一个数组……这是我的示例代码,我试图用输入值获取硬币的倍数

var flag=0;var chipval=0;var num=0;
var main = function(coins){
        var coinsarr = [1,5,10,25,50,100,500,501];var length=coinsarr.length
        var remval = coins;
        var coinskey = "";
        while(flag==0){
            for(i=0;i<length;i++){
                if(coinsarr[i]>remval){
                    chipval = coinsarr[i-1];
                    num = parseInt(remval/chipval);
                    if(remval%chipval==0){
                        flag = 1;
                        break;
                    }else{
                        remval=remval%chipval;
                        $flag = 0;
                        break;
                    }
                }
            }
            coinskey = coinskey+","+chipval+":"+num;
        }
        coinskey = coinskey.replace(/(^,)|(,$)/g, "")
        alert(coinskey);
    }

当我运行 main(120) 时,这将返回 100:2,10:2(这与 2 的 100 个硬币和 2 的 10 个硬币无关)

当我运行 main(720) 时,我遇到了内存泄漏……上面写着“此页面上的脚本使用了太多内存”;谁能告诉我,问题出在哪里,否则这是正确的方法吗?

感谢您的时间和耐心...

4

2 回答 2

1

如果您传递给函数的值大于数组中的最大值,则您有一个无限循环,因为flag永远不会改变。

具体来说,此if语句中的条件:

if(coinsarr[i]>remval){

720...对于(或超过 的任何其他数字)永远不会成立501

另外,$flag = 0不应该flag = 0吗?就目前而言,您创建了一个$flag永远不会被使用的全局变量。

于 2013-01-28T07:35:50.943 回答
1

获得一定数量的硬币来构成一个值的一个稍微干净的选择是构建一个包含这些值的对象。像这样的东西可以解决问题:

function coins(value){
    var coinsarr = [1,5,10,25,50,100,500,501];
    var out = {};
    while(value > 0){
        var i = 0;
        while(coinsarr[i+1] <= value){
            i++; // Find the coin to add.
        }
        var coin = coinsarr[i];
        value -= coin;
        if(!out[coin]){
            out[coin] = 0;
        }
        out[coin]++;
    }
    return out;
}

coins(499);
// {        Returns:
//     1: 4
//     10: 2
//     25: 1
//     50: 1
//     100: 4
// }
coins(21359);
// {        Returns:
//     1: 2
//     5: 1
//     10: 1
//     100: 3
//     501: 42
// }

这样做的好处是您可以比解析字符串更容易地检索值:

var coinsObj = coins(499);
for(var key in coinsObj){
    console.log(coinsObj[key] + ' times coin "' + key + '"' );
}
// 4 times coin "1"
// 2 times coin "10"
// 1 times coin "25"
// 1 times coin "50"
// 4 times coin "100"

或者只是构建一个这样的字符串:

var coinsObj = coins(499);
var outString = ''
for(var key in coinsObj){
    outString += ',' + key + ':' + coinsObj[key];
}
outString = outString.substr(1); // Remove the leading comma.
于 2013-01-28T07:53:52.997 回答