Reverse string using recursion in Objective-C

In order to refresh my memory and relax a bit, I’ll write few blog posts about programming fundamentals. First is the famous question on job interview – understanding recursion. Most common requirement is to reverse string using recursion.  Source code and step by step description is below. In this case lets try to reverse my first name.


- (NSString *)reverseStringWithRecursion:(NSString *)string
{
NSLog(@"1. string to reverse: %@", string);

NSUInteger count = [string length];

if (count <= 1) {
return string;
}
else
{
NSString *lastChar = [string substringWithRange:NSMakeRange(count - 1, 1)];
NSLog(@"2. lastChar (%@)", lastChar);

NSString *restOfCharsWithoutLastChar = [string substringToIndex:count - 1];
NSLog(@"3. restOfCharsWithoutLastChar (%@)", restOfCharsWithoutLastChar);

NSLog(@"4. recursion call with (%@)", restOfCharsWithoutLastChar);
NSString *recursionOutput = [self reverseStringWithRecursion:restOfCharsWithoutLastChar];
NSLog(@"5. recursionOutput (%@)", recursionOutput);

NSString *returnString = [lastChar stringByAppendingString:recursionOutput];
NSLog(@"6. lastChar (%@) + recursionOutput (%@) = %@", lastChar, recursionOutput, returnString);

return returnString;
}
}
  • 1. string to reverse: Ivan
  • 2. lastChar (n)
  • 3. restOfCharsWithoutLastChar (Iva)
  • 4. recursion call with (Iva)
    • 1. string to reverse: Iva
    • 2. lastChar (a)
    • 3. restOfCharsWithoutLastChar (Iv)
    • 4. recursion call with (Iv)
      • 1. string to reverse: Iv
      • 2. lastChar (v)
      • 3. restOfCharsWithoutLastChar (I)
      • 4. recursion call with (I)
        • 1. string to reverse: I
      • 5. recursionOutput (I)
      • 6. lastChar (v) + recursionOutput (I) = vI
    • 5. recursionOutput (vI)
    • 6. lastChar (a) + recursionOutput (vI) = avI
  • 5. recursionOutput (avI)
  • 6. lastChar (n) + recursionOutput (avI) = navI

If you don’t want to use recursion here is simple solution using while loop:

- (NSString*)reverseString:(NSString*)string
{
NSMutableString *reversedString = [NSMutableString string];

NSInteger charIndex = [string length];

while (string && charIndex > 0)
{
charIndex--;
[reversedString appendString:[string substringWithRange:NSMakeRange(charIndex, 1)]];
}

return reversedString;
}

Leave a Reply

Your email address will not be published. Required fields are marked *