Visualizzazione dei risultati da 1 a 5 su 5

Discussione: Funzione ricorsiva

  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    49

    Funzione ricorsiva

    Buongiorno a tutti,
    ho programmato poco con le funzioni ricorsive, perciò ora mi trovo a sbattere il muso contro un algoritmo che alcuni potrebbero trovare banale. Quindi perchè non chiedere alla fantastica comunità di HTML?
    Allora, tanto per inquadrare il linguaggio di programmazione, sto parlando di Javascript, ma questo può essere utile per le inizializzazioni delle variabili, perchè per il resto è un algoritmo che può essere espresso in qualsiasi linguaggio e voi fatelo pure. Ecco il problema:
    Ho un numero di cifre non fissato che variano in un range non fissato e voglio che la loro somma dia un numero che decido. Voglio trovare quante combinazioni sommate diano il numero che decido. Es.
    3 cifre
    ogni cifra può variare tra 2 e 8 con uno step di 2 (2,4,6,8)
    La somma delle tre cifre deve dare 12. Ci sono 10 combinazioni delle tre cifre che danno come somma 12.
    Ecco quello che ho tirato fuori io, ma vi anticipo che è sbagliato. Suggerimenti, alternative?

    //Inizializzazione script
    var cifra = new Array();
    //result : numero di combinazioni
    var result = 0;
    //ncifre : numero di cifre da combinare
    var ncifre = 3;
    //max_number : massimo valore che può acquisire una cifra
    var max_number = 8;
    //min_number : minimo valore che può acquisire una cifra
    var min_number = 2;
    //step_medias : ogni quanto aumenta una cifra tra due controlli di combinazioni
    step_medias = 2;
    //media_points : media delle cifre
    var media_points = 4;
    var w = 0;
    for(w=0;w<ncifre;w++)
    {
    //cifra.push(min_number);
    cifra.push(min_number - step_medias);
    }
    //Funzione che richiama la funzione ricorsiva
    function clickclick()
    {
    for(w = 0;w < ncifre;w++)
    {
    //cifra.push(min_number);
    cifra[w] = min_number - step_medias;
    }
    result = 0;
    onCl(0);
    }
    //funzione ricorsiva
    function onCl(i)
    {
    var j;
    for(j =cifra[i];j < max_number; j+=step_medias)
    {
    var sum =0;
    cifra[i] += step_medias;
    if (i< (ncifre-1))
    onCl(i+1);
    else
    {
    for(k=0;k<ncifre;k++)
    {
    sum += cifra[k];
    }
    if(sum == (ncifre*media_points) )
    result++;
    }

    }
    cifra[i] = min_number;

    if(i==0)
    {
    //document.result_calcolo.value = result;
    alert(result);
    }
    return;
    }

    Grazie a tutti quelli che han letto fin qui

  2. #2
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Così proprio non va bene, usa i tag code per postare il codice e indentalo senno è difficile leggerlo.

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    49
    codice:
    //Inizializzazione script
    var cifra = new Array();
    //result : numero di combinazioni
    var result = 0;
    //ncifre : numero di cifre da combinare
    var ncifre = 3;
    //max_number : massimo valore che può acquisire una cifra
    var max_number = 8;
    //min_number : minimo valore che può acquisire una cifra
    var min_number = 2;
    //step_medias : ogni quanto aumenta una cifra tra due controlli di combinazioni
    step_medias = 2;
    //media_points : media delle cifre
    var media_points = 4;
    var w = 0;
    for(w=0;w<ncifre;w++)
    {
       //cifra.push(min_number);
       cifra.push(min_number - step_medias);
    }
    //Funzione che richiama la funzione ricorsiva
    function clickclick()
    {
       for(w = 0;w < ncifre;w++)
       {
           //cifra.push(min_number);
          cifra[w] = min_number - step_medias;
       }
       result = 0;
       onCl(0);
    }
    //funzione ricorsiva
    function onCl(i)
    {
       var j;
       for(j =cifra[i];j < max_number; j+=step_medias)
       {
          var sum =0;
          cifra[i] += step_medias;
          //Ricorsione
          if (i< (ncifre-1))
             onCl(i+1);
          //Somma delle cifre
          for(k=0;k<ncifre;k++)
          {
              sum += cifra[k];
          }
          if(sum == (ncifre*media_points) )
              result++;
    
        }
       //Reinizializzao la cifra per ritornare alla cifra maggiore
       cifra[i] = min_number;
       //Quando finisco la cifra 0 allora result è il mio risultato finale
       if(i==0)
       {
           //document.result_calcolo.value = result;
          alert(result);
       }
       return;
    }

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    49
    Ho abbandonato le funzioni ricorsive e ho scritto un po' più di codice, ma con soluzione buona al problema. La posto, ma se qualcuno avesse risolto il problema ricorsivamente oppure abbia idea di come ottimizzare la mia soluzione, batta un colpo
    Ecco il codice:
    codice:
    var cifra = new Array();
    //result : numero di combinazioni
    var result = 0;
    //ncifre : numero di cifre da combinare
    var ncifre = 3;
    //max_number : massimo valore che può acquisire una cifra
    var max_number = 4;
    //min_number : minimo valore che può acquisire una cifra
    var min_number = 2;
    //step_medias : ogni quanto aumenta una cifra tra due controlli di combinazioni
    step_medias = 1;
    //media_points : media delle cifre
    var media_points = 3;
    var w = 0;
    for(w=0;w<ncifre;w++)
    {
    //cifra.push(min_number);
    cifra.push(min_number);
    }
    function clickclick()
    {
        for(w = 0;w < ncifre;w++)
    	{
    		//cifra.push(min_number);
    		cifra[w] = min_number;
    	}
    	result = 0;
    	onCl();
    }
    function onCl()
    {
    	var k;		
    	var cnt_cifra = ncifre-1;
    	while(cifra[0] <= max_number )
    	{
    		var sum =0;
    		for(k=0;k<ncifre;k++)
    		{
    			sum += cifra[k];
    		}
    		if(sum == (ncifre*media_points) )
    				result++;	
    
    		while(cifra[cnt_cifra] == max_number & cnt_cifra > 0)
    		{
    			cifra[cnt_cifra] = min_number;
    			cnt_cifra--;
    		}
    		cifra[cnt_cifra] += step_medias;
    		cnt_cifra = ncifre-1;
    	}
    	//document.result_calcolo.value = result;
    	alert(result);
    	return; 
    }

  5. #5
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463

    Moderazione

    Le domande su JavaScript vanno nella sezione apposita, non in Programmazione.
    Sposto.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

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 © 2025 vBulletin Solutions, Inc. All rights reserved.