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

Langage Perl Discussion :

fonction récursive sur string


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut fonction récursive sur string
    Bonjour,

    J'ai une séquence, par exemple TYART et j'aimerais trouver toutes les combinaisons possibles de séquences ne contenant que des A, T, C ou G. Donc, il faudrait trouver TTAGT, TCAGT, TTAAT et TCAAT

    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
    #!/usr/local/bin/perl
     
    use strict;
    use warnings;
     
    my $amorce = 'ATGGTMCAGATTCRCHTTC ';
    my @a_amorces = split ('', $amorce);
    my %h_amorces;
     
    my %correspondances =
        (
                'R' => ['A', 'G'],
                'K' => ['G', 'T'],
                'S' => ['C', 'G'],
                'W' => ['A', 'T'],
                'M' => ['A', 'C'],
                'Y' => ['C', 'T'],
                'D' => ['A', 'G', 'T'],
                'V' => ['A', 'C', 'G'],
                'B' => ['C', 'G', 'T'],
                'H' => ['A', 'C', 'T'],
                'N' => ['A', 'C', 'G', 'T'],
        );
     
    my $amorce_cle;
     
    foreach my $nucleotide (@a_amorces){
     
        if  (exists $correspondances{$nucleotide}){
            my @a_degenerescence = $correspondances{$nucleotide};
            foreach my $deg (@a_degenerescence){
                push (@a_amorces_cles, $amorce_cle.$deg);
            }
        }
        else{
            $amorce_cle .= $nucleotide;
        }
    }

    Je pense que je suis partie vers une mauvaise voie et qu'il devrait y avoir moyen de créer une fonction récursive mais je ne sais pas par où commencer. Pourriez-vous m'aider s'il vous plait?

    Merci beaucoup,

  2. #2
    Membre expérimenté Avatar de CKLN00
    Homme Profil pro
    Bioinformaticien Java/Perl
    Inscrit en
    Avril 2008
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Bioinformaticien Java/Perl
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 210
    Par défaut
    pour info le code (pour coder les bases génétiques) que tu utiliser est de l'IUB/IUPAC j'ai trouver quelque résultats qui me semblent peu probant sur le CPAN mais c'est l'occasion de faire un petit module de traduction pour le CPAN Jasmine, je suis sur que tu as le niveau nécessaire pour ça

    pour ce qui est de t'aider dans l'implémentation la je suis un peu surcharger, mais j'essayerais de m'y pencher dans la journée !

  3. #3
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Voici ce que j'ai déjà écrit
    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
    sub recup_amorce{
        my $ref_amorce = $_[0];
        my $amorce_cle = $_[1];
        foreach my $nucleotide (@{$ref_amorce}){
     
            if  (exists $correspondances{$nucleotide}){
                my @a_degenerescence = $correspondances{$nucleotide};
                foreach my $deg (@a_degenerescence){
                    $amorce_cle .= $deg;
                    recup_amorce($ref_amorce, $amorce_cle)
                }
            }
     
            else{
                $amorce_cle .= $nucleotide;
            }
        }
    }
    Mais j'obtiens le message d'erreur suivant
    Deep recursion on subroutine "main::recup_amorce" at P:\Perl\scripts2\MANIPS~1\CONSEN~1.PL line 39.

  4. #4
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    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
    my %correspondances =
        (
                'R' => ['A', 'G'],
                'K' => ['G', 'T'],
                'S' => ['C', 'G'],
                'W' => ['A', 'T'],
                'M' => ['A', 'C'],
                'Y' => ['C', 'T'],
                'D' => ['A', 'G', 'T'],
                'V' => ['A', 'C', 'G'],
                'B' => ['C', 'G', 'T'],
                'H' => ['A', 'C', 'T'],
                'N' => ['A', 'C', 'G', 'T'],
        );
     
    my @a_degenerescences = $correspondances{'R'};
    map{print "$_\n";} @a_degenerescences ;
    Je n'arrive pas à récupérer les valeur de l'array ... c'est tellement stupide que ça m'énerve.

    Cela fonctionne avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my @a_degenerescences = $correspondances{'R'};
    foreach my $array ( @a_degenerescences){
        map{print "$_\n";} @{$array} ;
    }
    mais cela devient compliqué

  5. #5
    Membre expérimenté Avatar de CKLN00
    Homme Profil pro
    Bioinformaticien Java/Perl
    Inscrit en
    Avril 2008
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Bioinformaticien Java/Perl
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 210
    Par défaut
    $correspondances{'R'}; contien un Scalaire (comme le $ au début l'indique) mais c'est un Référence à un tableau qui lui meme contien le scalaire A et le scalaire G.
    donc pour obtenire la liste de scalaire correspondant à 'R' il faut faire par exemple : print @{$correspondances{'R'}} ;

    Edit :
    Citation Envoyé par Jasmine80 Voir le message
    mais cela devient compliqué
    bha normal les structures complex (un Hash de tableau ici) sont ... pas simple à manipulé puisqu'en fait les Hash et tableau ne contiennent que des scalaire !
    il faut comprendre qu'en fait un tableau de tableau n'est en fait qu'un tableau conteant des références vers d'autres tableau mais je pense que cela est bien mieux expliquer dans la

  6. #6
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    #!/usr/local/bin/perl
     
     
     
    use strict;
    use warnings;
     
    my $amorce = 'ATGGTMCAGATTCRCHTTC';
    my @a_amorce = split ('', $amorce);
     
     
     
     
    my %correspondances =
        (
                'R' => ['A', 'G'],
                'K' => ['G', 'T'],
                'S' => ['C', 'G'],
                'W' => ['A', 'T'],
                'M' => ['A', 'C'],
                'Y' => ['C', 'T'],
                'D' => ['A', 'G', 'T'],
                'V' => ['A', 'C', 'G'],
                'B' => ['C', 'G', 'T'],
                'H' => ['A', 'C', 'T'],
                'N' => ['A', 'C', 'G', 'T'],
        );
     
     
     
    my $amorce_cle = '';
    my @a_recup;
     
    recup_amorce ($amorce, $amorce_cle );
     
    map {print "=> ".$_."\n";}@a_recup;
     
    sub recup_amorce{
     
        # amorce de départ
        my $amorce = $_[0];
        # début déjà créé de l'amorce sans les dégénérescences
        my $amorce_cle = $_[1];
        # longueur de l'amorce clé
        my $l = length($amorce_cle);
        # on récupère la fin de $amorce qui n'a pas encore été traitée
        my $restant = substr ($amorce, $l);
     
        print "$amorce\t$amorce_cle\t$restant\n";
     
        # si il reste encore des nucléotides à traiter
        if(length($restant) > 0){
            my @a_nucleotides = split ('', $restant);
     
            # pour chacun des nucléotides, on regarde si il faut le traiter ou non
            foreach my $nucleotide (@a_nucleotides){
     
                # si le nucléotide est une base dégénérées
                if  (exists $correspondances{$nucleotide}){
     
                    # on va récupérer toutes les valeurs possibles
                    foreach my $deg (@{$correspondances{$nucleotide}}){
                        $amorce_cle .= $deg;
                        recup_amorce($amorce, $amorce_cle);
                    }
                }
     
                # si le nucléotide ne doit pas être modifié
                # on l'ajoute tel quel
                else{
                    $amorce_cle .= $nucleotide;
                }
            }
        }
        # séquence de l'amorce terminée
        # récupération dans un array
        else{
            push (@a_recup, $amorce_cle);
        }
    }
    Cela progresse petit à petit

Discussions similaires

  1. Fonction récursive sur fichiers table
    Par castorameur dans le forum SAGE
    Réponses: 2
    Dernier message: 05/05/2015, 08h52
  2. Fonction récursive sur le parcours d'une arborescence
    Par MINNIEandMICKEY dans le forum Général Java
    Réponses: 4
    Dernier message: 24/12/2014, 10h34
  3. [XSLT 1.0] Fonction récursive sur position
    Par r0shv dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 23/10/2013, 12h10
  4. Fonction récursives sur tableaux indeterminés
    Par Zangdaarr dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 10/01/2011, 10h06
  5. Fonction récursive renvoi sur page d'erreur
    Par peck dans le forum Langage
    Réponses: 1
    Dernier message: 23/12/2005, 10h08

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