Я новичок в функции и объектах 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 (что ничто для 100 монет 2 и 10 монет 2)

Когда я запускаю main (720), я получаю утечки памяти ... что говорит "Скрипт на этой странице использовал слишком много памяти"; Может кто-нибудь сказать мне, где проблема или это правильный путь?

Спасибо за ваше время и терпение ...

0
Satish Ravipati 28 Янв 2013 в 11:31

2 ответа

Лучший ответ

Немного более чистый вариант, чтобы получить количество монет, чтобы составить значение, заключался бы в создании объекта, содержащего значения. Что-то вроде этого сделает свое дело:

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.
1
Cerbrus 28 Янв 2013 в 08:04

Если значение, которое вы передаете в функцию, превышает максимальное значение в массиве, у вас есть бесконечный цикл, потому что flag никогда не изменяется.

В частности, условие в этом if выражении:

if(coinsarr[i]>remval){

... никогда не будет истинным для 720 (или любого другого числа, отличного от 501).

Кроме того, $flag = 0 не должно быть flag = 0? В его нынешнем виде вы создаете глобальную переменную $flag, которая никогда не используется.

1
nnnnnn 28 Янв 2013 в 07:35