2016-06-26 84 views
0

我在檢查的是字符串的第一個字母是0,如果它是刪除它並再次調用的方法來檢查是否仍然有0.我調試了這個,它似乎是當它完成數字沒有0,它會倒退。代碼:遞歸方法Objective-C

-(NSString *)deleteZerosOnFirst:(NSString *)card 
{ 
    NSString *firstLetter = [card substringToIndex:1]; 
    if ([firstLetter isEqualToString:@"0"]) { 
     card = [card substringFromIndex:1]; 
     [self deleteZerosOnFirst:card]; 
     NSLog(@"CARD: %@", card); 
     return card; 
    } 
    else { 
     NSLog(@"CARD: %@", card); 
     return card; 
    } 

} 
+0

是不是使用for循環的只是這件事?爲什麼你需要使其遞歸? –

+0

你能給我一些提示如何做到這一點?它應該迭代,直到滿足0不是第一個字符爲止。 – Stefan

+0

你沒有在任何地方合併遞歸的結果。第一次調用的結果總是隻是原始參數減去一個初始的「@」0「'。而你的意思是「倒退」? –

回答

3

這是你的遞歸調用:

[self deleteZerosOnFirst:card]; 

這不會修改字符串card引用。它創建並返回一個新的字符串。你忽略了返回的字符串。你想這樣的:

card = [self deleteZerosOnFirst:card]; 

但是,這確實是簡單了很多:

@implementation NSString (withoutLeadingZeroes) 

- (NSString *)withoutLeadingZeroes { 
    NSString *s = self; 
    while ([s hasPrefix:@"0"]) { 
     s = [s substringFromIndex:1]; 
    } 
    return s; 
} 

@end 
+0

嘿羅布,你的簡化方法必須在一個類別,或者你可以將它添加到任何你喜歡的.m文件中? –

+0

您可以將它作爲任何類的方法實現,或者作爲一個自由函數來實現,但它作爲一個類最有意義。 –

3

主要問題是你沒有使用遞歸的結果。的代碼中你稱自己的行應該這樣說:

card = [self deleteZerosOnFirst:card]; 

而且,你打電話deleteZerosOnFirst你做NSLog的面前。顛倒這兩條線的順序。這至少會以正確的順序爲您提供調試輸出。