2010-09-26 3 views
-3

Étant donné une chaîne et un nombre, cette fonction produira toutes les combinaisons possibles de n lettres de cette chaîne.Pourquoi ce code ne produit-il pas la sortie correcte?

-à-dire si je passe "ABCD" et 3, alors je devrais obtenir la sortie suivante:

abc 
abd 
acd 
bcd 

Voici le code

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [self expand_combinations:@"abcd" arg2:@"" arg3:3]; 
} 

-(void) expand_combinations: (NSString *) remaining_string arg2:(NSString *)s arg3:(int) remain_depth 
{ 
    if(remain_depth==0) 
    { 
     printf("%s\n",[s UTF8String]); 
     return; 
    } 

    for(int k=0; k < [remaining_string length]; ++k) 
    { 
     s = [s stringByAppendingString:[[remaining_string substringFromIndex:k] substringToIndex:1]]; 
     [self expand_combinations:[remaining_string substringFromIndex:k+1] arg2:s arg3:remain_depth - 1]; 
    } 
    return; 
} 

c'est lieu ce qu'il imprime

abc 
abcd 
abcd 
abcd 
+0

Quelle est la chaîne restante d'origine? abc? –

+0

Oui, il est passé à la fonction dans la méthode viewDidLoad. –

+0

@awake Je ne peux pas croire que vous ayez demandé à votre dernière douzaine de questions de trouver une fonction de permutation en Objective-C. – NullUserException

Répondre

1

Juste une solution rapide et sale (n'a pas renommé les noms de variables et ainsi de suite) pour votre fonction

-(void) expand_combinations: (NSString *) remaining_string arg2:(NSString *)s arg3:(int) remain_depth 
{ 
    NSString *newString = [remaining_string stringByReplacingCharactersInRange:NSMakeRange(remain_depth, 1) withString:@""]; 
    // NSLog(newString); 

    if(remain_depth==0) 
    { 
     printf("%s\n",[s UTF8String]); 
     return; 
    } 
    [self expand_combinations:remaining_string arg2:s arg3:remain_depth - 1]; 
    return; 
} 

sortie (I utilisé NSLog)

2010-09-26 04:27:26.462 Untitled[5417:207] abc 
2010-09-26 04:27:26.462 Untitled[5417:207] abd 
2010-09-26 04:27:26.463 Untitled[5417:207] acd 
2010-09-26 04:27:26.467 Untitled[5417:207] bcd 
+0

Il y a quelque chose qui ne va pas avec ça. Il n'imprime rien. Où avez-vous mis la déclaration du journal? –

+2

@awake, il n'y a rien de mal, s'il vous plaît regardez le code (et ses commentaires) à nouveau. – Arjan

+0

J'ai copié et collé le code. Ça ne marche pas. –

-2

je trouve la solution. C'est ici.

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [self expand_combinations:@"abcd" arg2:@"" arg3:3]; 
} 

-(void) expand_combinations: (NSString *) remaining_string arg2:(NSString *)s arg3:(int) remain_depth 
{ 
    if(remain_depth==0) 
    { 
     printf("%s\n",[s UTF8String]); 
     return; 
    } 

    NSString *str = [[NSString alloc] initWithString:s]; 
    for(int k=0; k < [remaining_string length]; ++k) 
    { 

     str = [s stringByAppendingString:[[remaining_string substringFromIndex:k] substringToIndex:1]]; 
     [self expand_combinations:[remaining_string substringFromIndex:k+1] arg2:str arg3:remain_depth - 1]; 

    } 
    return; 
} 

Les changements que j'ai fait pour le faire fonctionner sont dans la ligne

NSString *str = [[NSString alloc] initWithString:s]; 

De là, je remplace tous les cas de s avec str. Il semble qu'en utilisant s au lieu de str, une valeur importante était écrasée, ce qui causait le problème de ne pas fonctionner correctement. Il est nécessaire de créer une autre variable NSString str afin que le contenu de s ne soit pas écrasé.

+1

Pas très utile car vous n'expliquez pas quels sont les changements avec le code dans votre question. S'il vous plaît noter qu'il s'agit d'un site de questions et réponses, pour nous tous d'apprendre, pas un forum d'aide. – Arjan

+0

J'ai ajouté une explication à ma réponse, alors supprimez le vote -1. :) –

+2

awakeFromNib: Cette version fuit la chaîne que vous avez créée dans cet initialiseur, en la remplaçant par la chaîne que vous avez obtenue à partir de votre premier message 'stringByAppendingString:'. Il n'y a aucune raison de créer ce premier objet chaîne du tout. En outre, vous devriez lire sur 'substringWithRange:'. –

Questions connexes