2009-11-13 4 views
-1

J'essaye d'écrire une méthode qui utilise la récursivité pour imprimer la chaîne formée par "entrelacement" des chaînes str1 et str2. En d'autres termes, il doit alterner les caractères des deux chaînes: le premier caractère de str1, suivi du premier caractère de str2, suivi du deuxième caractère de str1, suivi du deuxième caractère de str2, etc.Imprimer des caractères alternés à partir de deux chaînes (entrelacement) en utilisant la récursivité Java

Comment j'irais à ce sujet?

+0

Pourquoi voulez-vous faire cela? Ce n'est pas, peut-être, les devoirs? – bmargulies

Répondre

3

L'idée générale de récursion est d'avoir une position de terminaison qui retourne une valeur constante de quelque sorte et tous les autres cas est construit au-dessus de cela.

Par exemple, la fonction factoriel, f(n) = n * (n-1) * (n-2) * ... * 2 * 1 a la condition de terminaison et les fonctions dépendantes suivantes:

f(1) = 1 
f(n) = n * f(n-1) for all n > 1 

donc pourrait être mis en œuvre:

def factorial(n): 
    if n == 1: 
     return 1; 
    return n * factorial(n-1) 

Dans votre cas, la condition de terminaison est quand l'une ou l'autre des cordes est vide, à ce moment-là, vous venez de coller l'autre corde à la fin. La fonction dépendante est simplement de saisir le premier caractère de la première chaîne puis d'appeler le niveau suivant en passant le reste de cette chaîne et l'autre chaîne, mais dans l'ordre inverse pour que vous alterniez.

def mix (s1, s2): 
    if s1 == "" return s2 
    if s2 == "" return s1 
    return s1.firstChar() + mix (s2, s1.allButFirstChar()); 

En Java, ceci se traduirait par ce qui suit. Soyez averti que, si ce sont les devoirs et que vous l'utilisez, vous aurez probablement échoué car vous seriez stupide de penser que vos éducateurs ne surveillent pas ces sites.

public class Demo { 
    public static String Mix (String s1, String s2) { 
     if (s1.length() == 0) return s2; 
     if (s2.length() == 0) return s1; 
     return s1.substring(0,1) + Mix (s2, s1.substring(1)); 
    } 
    public static void main(String[] args) { 
     System.out.println (Mix ("Hello", "There")); 
     System.out.println (Mix ("Hi", "There")); 
     System.out.println (Mix ("Hello again", "Pax")); 
     System.out.println (Mix ("", "")); 
     System.out.println (Mix ("1111", "")); 
     System.out.println (Mix ("111", "2")); 
     System.out.println (Mix ("111", "22")); 
     System.out.println (Mix ("111", "222")); 
     System.out.println (Mix ("111", "2222")); 
     System.out.println (Mix ("11", "2222")); 
     System.out.println (Mix ("1", "2222")); 
     System.out.println (Mix ("", "2222")); 
    } 
} 

sorties:

HTehlelroe 
HTihere 
HPealxlo again 

1111 
1211 
12121 
121212 
1212122 
121222 
12222 
2222 
2

Cela devrait fonctionner:

public String Interleave(String first, String second) 
{ 
    if (first.length() == 0) 
     return second; 
    if (second.length() == 0) 
     return first; 
    return first.substring(0,1) + second.substring(0,1) + 
     Interleave(first.substring(1), second.substring(1)); 
} 
+0

Et en effet cela * fonctionne *. D'une certaine manière, il semble "sale" de faire de la sous-chaîne sur les deux chaînes à un seul niveau de récursivité :-) mais il * est * plus efficace de cette façon. – paxdiablo

+0

Il est sale de toute façon ... Une chose stupide à faire avec la récursivité;) Sans parler de tous les frais généraux de l'ajout de chaîne au lieu d'utiliser un générateur de chaîne. – Kieveli

0

C'est le problème codingBat/String-2/mixString, sauf que vous voulez une solution récursive.

Ma solution est essentiellement le même que celui Kieveli:

public String mixString(String a, String b) { 
    return 
    a.isEmpty() ? b : 
    b.isEmpty() ? a : 
    a.substring(0, 1) + b.substring(0, 1) 
     + mixString(a.substring(1), b.substring(1)); 
} 
-1
String s1="12345"; 
    String s2="67890"; 


    char ch1[] = s1.toCharArray(); 
    char ch2 [] = s2.toCharArray(); 

    char[] ch3 = new char[10]; 
    // System.out.println("ch1"+ch1); 

    for(i=0;i<10;i++) 
    { 
     ch3[i*2]=ch1[i]; 

     ch3[i*2+1]=ch2[i]; 
     System.out.println("ttttttttttt"); 
     System.out.println(ch3[i]); 
    } 
Questions connexes