IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Fonction récursive vba [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 248
    Par défaut Fonction récursive vba
    Bonjour,

    Depuis lundi, je n'arrive pas à construire une fonction récursive dont le but est de remplir un tableau.

    Je peux avoir N plannings k individus. L'idée étant de lister re ventiler de toutes les manières possibles les k individus.

    Ex avec n=4 et k=3

    n1 n2 n3 n4
    0 0 0 3
    0 0 1 2
    0 0 2 1
    0 0 3 0
    0 1 0 2
    0 1 1 1
    0 1 2 0
    0 2 0 1
    0 2 1 0
    0 3 0 0
    1 0 0 2
    1 0 1 1
    1 0 2 0
    1 1 0 1
    1 1 1 0
    1 2 0 0
    2 0 0 1
    2 0 1 0
    2 1 0 0
    3 0 0 0

    L'optique choisie me conduit à vouloir modéliser de gauche à droite :
    Nom : Capture.PNG
Affichages : 178
Taille : 2,8 Ko

    Le tableau devrait contenir les intitulés :
    tab(0) = n1
    tab(1)=n2/n1=0
    tab(3)=n2/n1=1
    etc

    La récursivité semble dès lors s'imposer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Function recurs(param1,param2)
    if qqchoseLiéAuxParam then arret
    else
    redim preserv tabCombi(0 to max)
    tabCombi(max)=QqChoseEnLienAvecParam1et2
    max=max+1
    recurs=recurs(param1,param2)
    end if
    end function
    La fonction de récursivité devrait s'arrêter quand le nième planning est atteint pour le kième individu : nN/nN-1=k/nN-2=k/.../n1=k

    Je n'ai jamais fait de fonction récursive et je me sens dépassé en raisonnement théorique : depuis lundi je tente des énumérations/fonctions pour modéliser mais je bloque. Pourriez-vous m'aider svp?

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    retrait/
    Inscrit en
    Février 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Canada

    Informations professionnelles :
    Activité : retrait/

    Informations forums :
    Inscription : Février 2019
    Messages : 9
    Par défaut Fonction récursive VBA
    Bonjour Grandchef,

    Pour ton problème, chaque nouvelle ligne est générées à partir de la ligne précédente, donc ce n'est pas une fonction récursive.

    Voici le code qui permet de générer un tableau pour N planning et K individus.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    Option Explicit
     
    Sub GenPlan(ByVal N As Long, K As Long)
    Dim i As Long, x As Long, s As Long, j As Long
        Cells.ClearContents
        For i = 1 To N - 1
            Cells(1, i).Value = 0
        Next
        Cells(1, N).Value = K
        x = 1
        Do
            i = N
            Do While Cells(x, i) = 0 And i > 1
                i = i - 1
            Loop
            s = K - Sommer(x, 1, i - 1)
            If Cells(x, i).Value = s Then
                For j = i To N - 1
                    Cells(x + 1, j).Value = 0
                Next
                Cells(x + 1, N).Value = s - 1
            Else
                Cells(x + 1, i).Value = Cells(x, i).Value - 1
            End If
            Cells(x + 1, i - 1).Value = Cells(x, i - 1).Value + 1
            i = i - 2
            Do While i > 0
               Cells(x + 1, i).Value = Cells(x, i).Value
               i = i - 1
            Loop
            x = x + 1
         Loop Until Cells(x, 1) = K
    End Sub
     
    Function Sommer(ByVal line, ByVal fc As Long, ByVal lc As Long) As Long
    Dim s As Long, i As Long
        s = 0
        For i = fc To lc
           s = s + Cells(line, i).Value
        Next
        Sommer = s
    End Function
     
    Sub Test_GenPlan()
         Call GenPlan(4, 3)
    End Sub
     
    Tu n'a qu'à exécuter mettre en paramètre le nombre de Planning et d'individus dans la routine Test_GenPlan pour produire le tableau désiré.
    Rino702

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 248
    Par défaut
    Merci infiniment ! Faute de mieux j'étais parti sur un algo vraiment sale et peu performant.
    Bien vu pour la déduction d'une ligne à l'autre. Bonne journée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Fonction récursive en VBA
    Par GuiBar18 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 28/06/2012, 19h32
  2. [AC-2002] Fonction requête récursive VBA
    Par jobe3141 dans le forum Access
    Réponses: 11
    Dernier message: 24/02/2011, 16h30
  3. [XSLT] fonction récursive à N niveaux
    Par Mike35 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 10/03/2006, 12h30
  4. Fonction récursive renvoi sur page d'erreur
    Par peck dans le forum Langage
    Réponses: 1
    Dernier message: 23/12/2005, 10h08
  5. Problème de fonction récursive avec un TcxDBTreeList
    Par isachat666 dans le forum Composants VCL
    Réponses: 1
    Dernier message: 05/12/2005, 13h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo