मेरे पास यहां एक साधारण कोड है:

n=3;k=1

var combine = function(n, k) {
    let res = [];
    helper(1, []);
    function helper (start, temp) {
        if (temp.length === k) {
            console.log(1, temp);
            console.log(2, temp.slice());
            res.push(temp.slice());
            return;
        }        
        for (let i = start; i<=n; i++) {
            temp.push(i);
            helper(i+1, temp);
            temp.pop();
        } 
    }
    return res;
};

combine(n,k);

मेरा सवाल है, कंसोल लॉग में, मुझे लगता है कि अस्थायी temp.slice() जैसा ही है। लेकिन res.push(temp), res.push(temp.slice()) से अलग है

res.push(temp) खाली ऐरे को रेस करने के लिए पुश करें। res.push(temp.slice()) सही मानों को पुश करें। नीचे कंसोल लॉग और आउटपुट है।

1 [ 1 ]
2 [ 1 ]
1 [ 2 ]
2 [ 2 ]
1 [ 3 ]
2 [ 3 ]
[ [ 1 ], [ 2 ], [ 3 ] ]

1 [ 1 ]
2 [ 1 ]
1 [ 2 ]
2 [ 2 ]
1 [ 3 ]
2 [ 3 ]
[ [], [], [] ]

कृपया कोई मुझे बता सकता है कि यहाँ क्या गलत है? मैं बस [1], [2], [3] को सरणी में धकेलना चाहता हूं।

-1
57659 1 पद 2020, 05:45

1 उत्तर

सबसे बढ़िया उत्तर

उस स्थिति पर विचार करें जब n=1 और k=1. आपका कार्य इसके बराबर होगा:

let res = [];
let temp = [];

for (let i = 1; i <= 1; i++) {
    temp.push(i);
    if (temp.length === 1) {
       res.push(temp.slice());
       // wrong: res.push(temp);
    }
    temp.pop();
}

जब आप temp को res पर धकेल रहे हैं, तो आप इसके संदर्भ को आगे बढ़ा रहे हैं। जब आप temp.pop() को कॉल करते हैं, तो res के अंदर की उस सरणी को भी संशोधित किया जाएगा। जब आप temp.slice का उपयोग करते हैं, तो आप temp का एक-स्तरीय गहरा क्लोन बना रहे होते हैं, जो आपको उस क्लोन को संशोधित किए बिना temp पर पॉप कॉल करने की अनुमति देता है।

1
Alberto Rivera 1 पद 2020, 03:01