Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19
  1. #1

    Calcolo combinatorio: devo scrivere tutte le combinazioni... E' possibile in js ?

    Ragazzi spero possiate darmi qualche dritta...

    devo provare a creare un pezzo di codice che mi scriva tutte le combinazioni perche' sono troppe da scrivere a mano.

    praticamente parliamo di combinazioni semplici senza ripetizione e senza ordine. E io posso avere combinazioni di lunghezza minima "K=1" e lughezza massima "K=2".
    Nello specifico ho:

    12 elementi, ovvero

    [a,b,c,d,e,f,g,h,i,l,m,n]

    e la formula che mi permette di "calcolare in numero totale" di combinazioni e' questa:

    n!/(k!*(n-k)!)

    dove n= numero elementi (ovvero 12)
    k= lunghezza combinazione

    ora facendo la stessa formula con k=1 e poi di nuovo con k=2 e di nuovo e di nuovo fino a k=12
    e sommando i risultati, abbiamo che ci sono:

    4095 conbinazioni

    io vorrei qualcosa che mi scrivesse tutte queste combinazioni... Perche' sinceramente sono un po' tante da scrivere a mano.

    qualche dritta????
    grazie

    mille

  2. #2
    Moderatore di JavaScript L'avatar di br1
    Registrato dal
    Jul 1999
    Messaggi
    19,998
    Quote Originariamente inviata da Rodrigoson6 Visualizza il messaggio
    E io posso avere combinazioni di lunghezza minima "K=1" e lughezza massima "K=2".
    ...
    ora facendo la stessa formula con k=1 e poi di nuovo con k=2 e di nuovo e di nuovo fino a k=12
    Deciditi: vuoi le combinazioni con 1 o 2 elementi o tutte le combinazioni da 1 a 12 elementi?
    Il guaio per i poveri computers e' che sono gli uomini a comandarli.

    Attenzione ai titoli delle discussioni: (ri)leggete il regolamento
    Consultate la discussione in rilievo: script / discussioni utili
    Usate la funzione di Ricerca del Forum

  3. #3
    Volevo dire "k=12" e non k=2

  4. #4
    Ho trovato qualcosa sul web.... ma sinceramente non ci ho capito tanto....

    ecco il codice


    codice:
    function bitprint(u) {
      var s="";
      for (var n=0; u; ++n, u>>=1)
        if (u&1) s+=n+" ";
      return s;
    }
    function bitcount(u) {
      for (var n=0; u; ++n, u=u&(u-1));
      return n;
    }
    function comb(c,n) {
      var s=[];
      for (var u=0; u<1<<n; u++)
        if (bitcount(u)==c)
          s.push(bitprint(u))
      return s.sort();
    }
    comb(3,5)

    le combinazioni dovrebbero essere queste:

    codice:
    // 0 1 2
     0 1 3
     0 1 4
     0 2 3
     0 2 4
     0 3 4
     1 2 3
     1 2 4
     1 3 4
     2 3 4

    ma non so come mostrare in output le combinazioni....



    mi date una mano?

  5. #5
    Aspettate forse ho trovato qualcosa di meglio:


    codice:
    function getCombinations(arr, n)
    {
        if(n == 1)
        {
            var ret = [];
            for(var i = 0; i < arr.length; i++)
            {
                for(var j = 0; j < arr[i].length; j++)
                {
                    ret.push([arr[i][j]]);
                }
            }
            return ret;
        }
        else
        {
            var ret = [];
            for(var i = 0; i < arr.length; i++)
            {
                var elem = arr.shift();
                for(var j = 0; j < elem.length; j++)
                {
                    var childperm = getCombinations(arr.slice(), n-1);
                    for(var k = 0; k < childperm.length; k++)
                    {
                        ret.push([elem[j]].concat(childperm[k]));
                    }
                }
            }
            return ret;
        }
    }
    var arr = [["1"],["2"],["3"],["4"],["5"],["6"],["7"],["8"],["9"],["10"],["11"],["12"]];
    var n = 2;
    
    var results = getCombinations(arr.slice(),n);
    document.getElementById("results").innerHTML = "[";
    for(var i = 0; i < results.length; i++)
    {
        document.getElementById("results").innerHTML += "[" + results[i] + "]";
    }
    document.getElementById("results").innerHTML += "]";
    Ultima modifica di Rodrigoson6; 30-12-2013 a 13:30

  6. #6
    quindi in OUTPUT avrei le seguente combinazioni :


    codice:
    [[1,2][1,3][1,4][1,5][1,6][1,7][1,8][1,9][1,10][1,11][1,12][2,3][2,4][2,5][2,6][2,7][2,8][2,9][2,10][2,11][2,12][3,4][3,5][3,6][3,7][3,8][3,9][3,10][3,11][3,12][4,5][4,6][4,7][4,8][4,9][4,10][4,11][4,12][5,6][5,7][5,8][5,9][5,10][5,11][5,12][6,7][6,8][6,9][6,10][6,11][6,12]]
    ma c'è un modo ad esempio per sommare gli elementi presenti tra le varia parantesi quadre?

    ad esmepio:

    [[1,2,].....ecc]]

    quindi avrere

    1+2= 3



    ????

  7. #7
    ok ci sono quasi riuscito ma vorrei sapere una cosa..... SPERANDO CHE ALMENO QUESTA VOLTA QUALCUNO MI RISPONDA :

    dato il codice ottimizzato:

    codice:
    function getCombinations(arr, n){
        var i,j,k,elem,l = arr.length,childperm,ret=[];
        if(n == 1){
            for(var i = 0; i < arr.length; i++){
                for(var j = 0; j < arr[i].length; j++){
                    ret.push([arr[i][j]]);
                }
            }
            return ret;
        }
        else{
            for(i = 0; i < l; i++){
                elem = arr.shift();
                for(j = 0; j < elem.length; j++){
                    childperm = getCombinations(arr.slice(), n-1);
                    for(k = 0; k < childperm.length; k++){
                              var elej= elem[j];
               
                        var chik= (childperm[k]);
                        var cos= (-1*((-1*elej) + (-1*chik)))/n;
                        ret.push(cos);
                    }
                }
            }
            return ret;
        }
        i=j=k=elem=l=childperm=ret=[]=null;
    }
     
    
    var x = 60;
    var arr = [["10"],["20"],["35"],["5"]];
    var n = 2;
    
    var results = getCombinations(arr.slice(),n);
    document.getElementById("results").innerHTML = "[";
    for(var i = 0; i < results.length; i++)
    {
         if (((x-results[i]) <= 50) && ((x-results[i]) >= 40))  {
            alert(x-results[i]);
        }
        document.getElementById("results").innerHTML += "[" + results[i] + "]";
    }
    document.getElementById("results").innerHTML += "]";

    cosi funziona.... ma se io volessi cambiare gli elementi per le combinazioni, inserendo delle variabili (prese da altre funzioni, e che hanno ovviamente un valore numerico...non funziona). Ad esempio sostituire cosi:

    codice:
    var x = 60;
    var arr = [["10"],["20"],["35"],["5"]];
    var n = 2;

    con


    codice:
    var x = 329;
    var arr = [["D18"],["D6"],["D7"]];
    var n = 2;

    non capisco perché non funziona..... (mettendoci anche le chiamate alle funzioni in cui vengono generate "le variabili")




    SPERIAMO

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    3,660
    il metodo getCombinations effettua delle operazioni su dati numerici, è ovvio che se valorizzi l'array con dati non numerici non potrà mai funzionare.

  9. #9
    anche se la situazione fosse cosi:

    codice:
    var D18= 10;
    var D6= 20;
    var D7= 35;
    var x = 329;
    var arr = [["D18"],["D6"],["D7"]];
    var n = 2;

    ???????

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    3,660
    si, le variabili non vanno racchiuse tra apici:
    var arr = [[D18],[D6],[D7]];

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.