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