Почему этот код не дает правильный вывод? [закрыто]

Учитывая строку и число, эта функция создаст все возможные комбинации 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
 NullUserException26 сент. 2010 г., 04:16
@awake Независимо.
 node ninja26 сент. 2010 г., 04:08
Да, он передается функции в методе viewDidLoad.
 node ninja26 сент. 2010 г., 04:15
Это не функция перестановки, это комбинированная функция.
 Henrik P. Hessel26 сент. 2010 г., 04:07
Какая оригинальная оставшаяся строка? а?
 NullUserException26 сент. 2010 г., 04:14
@ Пробудитесь, я не могу поверить, что ваши последние дюжины вопросов или около того были заданы для создания функции перестановки в Objective-C.
 Henrik P. Hessel26 сент. 2010 г., 04:33
@NullUserException хе-хе, думал то же самое.

Ответы на вопрос(2)

Решение Вопроса

Просто быстрое и грязное решение (не переименовывать имена переменных и т. Д.) Для вашей функции

-(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
 Arjan26 сент. 2010 г., 08:43
@ Пробудитесь, в этом нет ничего плохого, пожалуйста, посмотрите на код (и его комментарии) еще раз.
 node ninja26 сент. 2010 г., 08:23
С этим что-то не так. Это ничего не печатает. Где вы положили запись журнала?
 node ninja26 сент. 2010 г., 09:15
Я копирую и вставляю код. Не работает
 Arjan26 сент. 2010 г., 09:36
@ Пробудитесь, вы смотрели комментарий в коде, как я написал?
 Henrik P. Hessel26 сент. 2010 г., 16:24
Просто раскомментируйте NSLog, чтобы увидеть новую строку в вашей консоли. Я закомментировал это.

Я нашел решение. Вот.

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

Оттуда я заменяю каждый экземпляр s на str. Кажется, что при использовании s вместо str, некоторые важные значения перезаписывались, что приводило к некорректной работе проблемы. Необходимо создать другую переменную NSString str, чтобы содержимое s не перезаписывалось.

 node ninja26 сент. 2010 г., 10:11
Я добавил пояснение к своему ответу, поэтому уберите -1 голос. :)
 Peter Hosey26 сент. 2010 г., 22:05
awakeFromNib: эта версия пропускает строку, созданную вами в этом инициализаторе, заменяя ее строкой, полученной из вашего первогоstringByAppendingString: сообщение. Нет никакой причины создавать этот первый строковый объект вообще. Кроме того, вы должны прочитатьsubstringWithRange:.
 Arjan26 сент. 2010 г., 10:01
Не совсем полезно, так как вы не объясняете, каковы изменения с кодом в вашем вопросе. Пожалуйста, обратите внимание, что это сайт вопросов и ответов для ВСЕХ из нас, а не справочный форум.

Ваш ответ на вопрос