pour i=1 à 9 //la premiere note
pour j=i+1 a 9//la deuxieme note
pour k=j+1 a 9//la troisieme note
pour l=k+1 a 9 //la quatrieme note
afficherAccord(i,j,k,l)
finpour
finpour
finpourfatal_error a écrit:petit défi pour les enfermés du mauvais temps du weekend, la version récursive, est assez immédiate.
Quid de la version itérative?
// Calcul de C(n,k) sans récursion
#define k 4
#define n 9
#define max_stack k+1
void main(void)
{
int indice[max_stack];
int i=0;
// init
for ( i = 0; i =0; i--)
if (indice[i] < n -k +i)
break;
indice[i]++;
//Réinitialisation de tous les chiffres à droite de i
for (i++; i<=k; i++)
indice[i]= indice[i-1]+1;
}
}
function list(k, n , arr){
if(k==1){
for(var i=0;i o+1 _ | _
var unpopped=false;
while(!unpopped){
stack.pop();//1 _ _ | _
if(stack.length==0){//we popped everything, time to leave
return;
}
var val = stack[stack.length-1];// o _ _ | _: 1
var nbLeftIter = k - stack.length;
if(nbLeftIter + val+1<n){//we add random number as well!
stack[stack.length-1]++;
unpopped = true;
}
}
}
}else{// _ | _: case of adding incremented
//we can increment next stack: 1 2 _ | _
stack.push(stack[stack.length-1]+1);
}
}
console.log('fail to recurse '+increment);
}
fatal_error a écrit:j'intuite qu'on peut s'en sortir à coup de modulo/divisions!
void main(void)
{
int indice[max_stack];
int i, max,nb, reste,chiffre,pos,base,ok;
base = n-k+1;
[COLOR=DarkGreen]// calcule de base ^k[/COLOR]
for (max=1, i=0;i0 ; pos++,reste = reste /base )
{
chiffre = reste %base;
if (pos>0 && (chiffre > indice[k-pos]))
{
ok =false;
break;
}
else
indice[k-1-pos]=chiffre;
}
if ( ok)
{
[COLOR=DarkGreen]//impression de la solution [/COLOR]
for (i = 0; i< k;i++)
printf("% d",indice[i] + i +1 );
printf ("\n");
}
}
}:- use_module(library(clpfd)).
toutes_les_combi(M, N, L) :-
bagof(Combi, combi(M, N, Combi), L).
combi(M, N, Combi) :-
length(Combi, N),
Combi ins 1..M,
chain(Combi, #<),
label(Combi).Ce serait super de pouvoir changer la taille de la combinaison depuis l'extérieur du prog.
Tu a l'air de dire que ce serait possible en récursif, je serais preneur du pseudo-code
combi(k,n, depth, currentHand, beg)
si depth==k
//on a une solution
afficher currentHand
else
for(int i=beg+1, i<n, i++){
currentHand[depth] = i;
combi(k,n, depth+1, currentHand, i);
}
finsi
finfuncOu le pseudo-code de vos versions itératives. (on est pas à quatre lignes près, c'est pas moi qui les executes).
PS: Ton algo récursif est un plaisir.
/**
k: entier > 1
n: entier > k
arr: tableau de taille n
affiche toutes les combinaisons de k elem pris dans arr
*/
function list(k, n , arr){
if(k==1){
for(var i=0;i 123x -> 124 ?
stack.pop();
if(stack[stack.length-1]+1 126x -> 127...
//on cherche le premier digit en partant de la droite qu'on peut
//incrémenter
var unpopped=false;
while(!unpopped){
stack.pop();
//si la pile est vide, c'est qu'on pouvait plus
//rien incrémenter, on a fini, donc on quitte
if(stack.length==0){
return;
}
var val = stack[stack.length-1];
var nbLeftIter = k - stack.length;
//si on peut incrémenter le digit, alors on l'incrémente
//et on boucle
if(nbLeftIter + val+1123
stack.push(stack[stack.length-1]+1);
}
}
console.log('fail to recurse '+increment);
}fatal_error a écrit:@lejeu,
apres coup je sais pas si on peut faire mieux que ce que tu as proposé comme premier code (ou avec le petit correctif). Si on considère qu'une boucle for c'est plein de if, en fait, avoir deux boucles for ou un gros while et un if, ca change pas grand chose!
Du coup, par exemple y aller a coup de modulo c'est ptet même plus couteux que des ifs!
Je pense que ta première version est meilleure que ta base n-k+1, ainsi que ce que je propose. Il faudrait mesurer, pe ce we je m'y attelerai.
tu connais une façon formelle de transformer une écriture récursive en itérative
tu es partie d'une écriture récursive que tu as transformée , ou tu as "vu" direct ce que tu voulais pusher/poper?
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 2 invités
Tu pars déja ?
Identification
Pas encore inscrit ?
Ou identifiez-vous :