2016-09-25 3 views
0

Ich habe ein Array von 4 chars, ['A', 'C', 'T', 'G'], und rekursiv Listen mit einer gegebenen Länge und GC-Inhalt (die Anzahl der G und C's) erzeugt in einer Liste). Ich bin in der Lage, die Listen rekursiv zu generieren und zu überprüfen, ob sie die Bedingungen erfüllten, jedoch bleibt nach der ersten Iteration der for-Schleife (siehe unten) das "A", das der erste Knoten der Liste für die erste Iteration ist. Die drei anderen Methoden in diesem Projekt sind: gcContent (gibt ein int zurück, das den GC-Inhalt einer Liste darstellt), reverseComplement (gibt das umgekehrte Komplement einer Liste zurück, dh in umgekehrter Reihenfolge und alle Zeichen werden auf ihre umgeschaltet Komplement; A <> G, C <> T) und compare (vergleicht zwei Listen und gibt true zurück, wenn sie identisch sind). HierZusätzlicher Knoten in der Liste herumhängen - Rekursion verwenden, um Listen mit einer gegebenen Länge zu erzeugen

ist, was ich habe zur Zeit für reverseComplement:

public void generateStrands(int n, int k, int rate, Node t){ 
    cont = 0; 
    char[] array = {'A', 'C', 'G', 'T'}; 
    if(k == n){ 
     if(!compare(t, reverseComplement(t)) && gcContent(t) == rate){ 
      t.printListLn(); 
     } 
    } 
    else{ 
     for(int i = 0; i < array.length; i++){ 
      t.add(array[i]); 
      generateStrands(n, k+1, rate, t); 
      t.remove(); 
     } 
    } 
} 

Und hier sind meine add und remove Methoden für meine Node Klasse:

public void add(char c){ 

     if(base == ' '){ 
      base = c; 
     } 
     else{ 
      Node p = this; 
      Node q = null; 
      while(p!=null){ 
       q = p; 
       p = p.next; 
      } 
      q.next = new Node(c, null); 
     } 
    } 

    public void remove(){ 

     if(base == ' ' || next == null){ 
      return; 
     } 
     else{ 
      Node p = this; 
      Node q = null; 
      while(p.next!=null){ 
       q = p; 
       p = p.next; 
      } 
      q.next = null; 
     } 
    } 

Und hier ist der Ausgang I erhalten (n = 2, Rate = 1):

AC 
AG 
ACA 
ACT 
AGA 
AGT 
ATC 
ATG 

Ich habe versucht, mit der remove Methode herumzuspielen, aber ich bin ziemlich sicher, dass diese Methode nicht das Problem ist und dass es die Reihenfolge bestimmter Codezeilen in der generateStrands Methode sein kann.

Antwort

0

Ich habe es herausgefunden. Benötigte drei Fälle für remove: eins wenn die Liste leer ist, eins wenn es nur ein Element gibt und zuletzt wenn es 2 oder mehr Elemente gibt.

public void remove(){ 
    if(base == ' ') 
     return; 
    else if(next == null) 
     base = ' '; 
    else{ 
     Node p = this; 
     Node q = null; 
     while(p.next!=null){ 
      q = p; 
      p = p.next; 
     } 
     q.next = null; 
    } 
} 

Mit dieser Version von remove arbeitet das Programm einwandfrei.

Verwandte Themen