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

C Discussion :

Créer des fonctions dynamiques


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 124
    Points : 53
    Points
    53
    Par défaut Créer des fonctions dynamiques
    Salut à tous,
    Est-il possible de créer une fonction qui crée elle-même d'autres fonctions.
    Je m'explique : j'ai une fonction avec un for (bon, on incrémente i de 1 dans le for ...), et je voudrais qu'à chaque fois que i change de valeur, une nouvelle fonction soit créée (déclarer quoi ...) en fonction de la nouvelle valeur de i.
    Merci pour votre aide.

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par Superne0
    Salut à tous,
    Est-il possible de créer une fonction qui crée elle-même d'autres fonctions.
    Je m'explique : j'ai une fonction avec un for (bon, on incrémente i de 1 dans le for ...), et je voudrais qu'à chaque fois que i change de valeur, une nouvelle fonction soit créée (déclarer quoi ...) en fonction de la nouvelle valeur de i.
    Merci pour votre aide.
    Donc tu veux écrire un code qui crée des fonctions pendant l'exécution ou un code qui lors de la compilation crée des fonctions...

    Jc

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 124
    Points : 53
    Points
    53
    Par défaut
    lors de l'éxécution a priori.

  4. #4
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Citation Envoyé par Superne0
    lors de l'éxécution a priori.
    Tu veux faire de la compilation dynamique alors ?
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 124
    Points : 53
    Points
    53
    Par défaut
    ben je débute en C, je connais pas grand chose à la compilation (rien en fait), et je ne sais pas comment GCC fonctionne (je suis sous mingw).
    je sais juste que mon problème pourrait peut-être se régler en creant des fonctions de cette manière.

  6. #6
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par Superne0
    ben je débute en C, je connais pas grand chose à la compilation (rien en fait), et je ne sais pas comment GCC fonctionne (je suis sous mingw).
    je sais juste que mon problème pourrait peut-être se régler en creant des fonctions de cette manière.
    Et si tu exposais ton problème pour voir s'il n'y a pas d'autre moyen de faire ?

    Quoique de la compilation dynamique ... ca je serais curieux de savoir comment sa fonctionne mais ca ne doit pas être une partie de plaisir
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 124
    Points : 53
    Points
    53
    Par défaut
    C'est un problème qui vient du site d'ACM et qui consiste à afficher le nombre G(n) de la suite définie par G(n)=1+G(n-G(G(n-1))) et G(1)=1
    Je pensais donc à créer une fonction qui créeraie elle-même d'autres fonctions (pour connaître G(n), il faut connaître G(n-1), et pour connaître G(n-1) il faut connaître G(n-2) etc ...).
    Donc le problème se règle très bien sans fonctions récursives (donc avec un simple for), très bien avec un récursif non-terminal, mais le problème est que le "Judge Online" du site d'ACM impose un temps minimum de 10s (je crois, mais c'est pas le plus important ...).

  8. #8
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par Franck.H
    Et si tu exposais ton problème pour voir s'il n'y a pas d'autre moyen de faire ?

    Quoique de la compilation dynamique ... ca je serais curieux de savoir comment sa fonctionne mais ca ne doit pas être une partie de plaisir
    A priori, il faut un support runtime important. Certains langages interprétés comme Smalltalk sont capables de modifier leur propre code pendant l'exécution. Cette pratique ouvre des perspectives amusantes, et permet de modifier un programme sans avoir à l'arrêter et à le re-lancer.

    Bien qu'il existe des interpréteurs pour le langage C, je n'ai jamais entendu parler de support pour de telles fonctionnalités en langage C.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  9. #9
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Pas besoin de créer des fonctions à l'exécution. Il s'agit juste de programmer une fonction récursive.

  10. #10
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par stephl
    Pas besoin de créer des fonctions à l'exécution. Il s'agit juste de programmer une fonction récursive.
    Oui je crois que le mieux est d'utiliser la récursivité ou une boucle éventuellement mais du point de vue rapidité je ne sais pas trop... faire quelque chose de pointu comme tu l'as demandé et en espérant que c'est une pratique réalisable en Langage C .... mieux vaut opter pour plus simple effectivement
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 124
    Points : 53
    Points
    53
    Par défaut
    Le problème est bien fait parce que n varie entre 1 et 2 milliard.
    Sur mon PC, la boucle met 6 secondes et quelques pour parcourir cet intervalle !
    Le problème avec la récursivité terminale, c'est dans la fonction auxiliaire qui prend 2 paramètres, là ça devient vite le bordel ...

  12. #12
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Hi,
    Citation Envoyé par Superne0
    le "Judge Online" du site d'ACM impose un temps minimum de 10s
    Bizarre, en général, c'est plutôt des temps maxi qu'on impose.

    Citation Envoyé par Superne0
    Le problème est bien fait parce que n varie entre 1 et 2 milliard.
    Sur mon PC, la boucle met 6 secondes et quelques pour parcourir cet intervalle !
    Le problème avec la récursivité terminale, c'est dans la fonction auxiliaire qui prend 2 paramètres, là ça devient vite le bordel ...
    Et tu penses réellement que créer des fonctions, leur demander un résultat... va améliorer les choses ?

    Citation Envoyé par Superne0
    Le problème est bien fait parce que n varie entre 1 et 2 milliard.
    Il est clair pour faut oublier la récursivité
    Si les cons volaient, il ferait nuit à midi.

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 124
    Points : 53
    Points
    53
    Par défaut
    Pour la première citation c'est une confusion de ma part.
    Pour la deuxième t'as raison.
    Et pour la troisième, le problème c'est qui si la suite de ne se programme pas en récursif terminal, alors je vois pas trop de solutions ... (aucune même).
    Et pourtant il y a bien un moyen de règler le problème (certains l'ont régler en 0.00 secondes et un espace de mémoire minimum).

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 86
    Points : 109
    Points
    109
    Par défaut
    Citation Envoyé par droggo
    Il est clair pour faut oublier la récursivité
    tu connais la recursion terminale ici
    While I breath, I hope.

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 124
    Points : 53
    Points
    53
    Par défaut
    En fait la récursion terminale c'est bien connu ...
    Le problème dans la programmation de cette séquence c'est plutôt l'encapsulation.

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 86
    Points : 109
    Points
    109
    Par défaut
    a partir de n=5 je trouve

    G(n)=1+G(n-G(G(n-1))) équivalent a
    G(n)=1+G(n-3)

    je ne l'ai pas démontré mais juste fais les calculs jusqu'a n=15
    While I breath, I hope.

  17. #17
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Hu,
    Citation Envoyé par scriptoff
    tu connais la recursion terminale ici
    Depuis le temps, j'avais oublié
    Si les cons volaient, il ferait nuit à midi.

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Points : 376
    Points
    376
    Par défaut
    équivalent a
    G(n)=1+G(n-3)
    : ce n'est pas exact.
    Par contre, il est vrai que la fonction progresse par paliers.
    Partant de là, j'ai fait un petit essai sans utiliser la récursivité.
    Dans le tableau tab, je me contente de stocker les abscisses lors des changements de palier.

    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
            unsigned int tab[100000];
            unsigned int max,i,k,v;
            long t1,t2;
     
            tab[0] = 0;
            tab[1] = 1;
     
     
            t1 = time(0);
     
            for (i=2,max=1;i<1000000;i++)
            {
                      // G(i-1)=max
                    for (k=max;tab[k]>=max;k--);
     
                      // G(G(i-1)) = k+1
                      // détermination de i-G(G(i-1))
                    v = i - (k+1);
                      // retrouve G(v)
                    for (k=max;tab[k]>=v;k--);
     
                    if (k+2>max)
                    {
                            tab[k+2] = i;
                    }
                    else tab[max] = i;
                      // G(i) = 1+G(i-G(G(i-1))) = k+2
                    max = k+2;
            }
            t2 = time(0)-t1;
     
            printf("%d - %d sec\n",max, t2);
    pour 1000000 passages dans la boucle, on est déjà à 7 sec (sur le PC utilisé et pour une valeur de la fonction de 6137). Bref, ce n'est pas le bon algorythme mais ça donne des idées pour se passer de la récursivité.

    Pour atteindre des performances telles que demandées, je pense qu'il faut effectivement réussir à exprimer G(n) en fonction de n. Mais du coup, cela perd de l'intérêt !

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 124
    Points : 53
    Points
    53
    Par défaut
    pourquoi tu définis le tableau à 100000 ?

  20. #20
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Points : 376
    Points
    376
    Par défaut
    C'est juste un petit essai que j'ai fait. En indice, tab reçoit les valeurs de G(x).
    G(1000000) vaut un peu plus de 6000. Dans mon exemple, unsigned tab[6300] suffirait donc.

    Je n'ai par contre pas d'idée sur la valeur de G(1000 000 000). Peut-être 100000 est-il insuffisant ? En fait, il faudrait faire dans une première étape un test pour vérifier qu'on ne déborde pas du tableau afin de pouvoir le dimmensionner correctement. Pour des souvis de performance, il faudrait ensuite supprimer le test.

    Dans l'exemple que j'ai donné, je parcours tab de manière séquentielle pour retrouver G(x). En fait, il faudrait une méthode plus rapide (ex: dichotomie ?).
    Mais même avec ça, je doute qu'on descende sous les 10 secondes.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 5 12345 DernièreDernière

Discussions similaires

  1. Procédure Stockée pour créer des TABLE dynamiquement
    Par GuyverZ dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 12/05/2009, 22h29
  2. Réponses: 3
    Dernier message: 22/01/2009, 21h05
  3. Réponses: 2
    Dernier message: 14/07/2006, 14h24
  4. Créer des fonctions de conversion d'unités
    Par frenzy dans le forum Langage
    Réponses: 6
    Dernier message: 01/03/2006, 09h52
  5. Créer des fonctions au sein d'un script
    Par mat.M dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 31/03/2004, 15h25

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