为什么这段代码没有产生正确的输出?

时间:2010-09-26 02:04:17

标签: objective-c cocoa cocoa-touch

给定一个字符串和一个数字,这个函数将产生该字符串中n个字母的所有可能组合。

即。如果我传递“abcd”和3,那么我应该得到以下输出:

abc
abd
acd
bcd

这是代码

- (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;
}

相反,这就是打印出来的

abc
abcd
abcd
abcd

2 个答案:

答案 0 :(得分:1)

您的功能只是一个快速而肮脏的解决方案(没有重命名变量名等等)

-(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;
}

输出(我使用的是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

答案 1 :(得分:-2)

我找到了解决方案。在这里。

- (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;
}

我为使其发挥作用所做的更改在

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

从那里我用str替换s的每个实例。似乎通过使用s而不是str,一些重要的值被覆盖,这导致问题无法正常工作。有必要创建另一个NSString变量str,以便s的内容不会被覆盖。