The C Programming Language, 2nd Edition, by Kernighan and Ritchie
Exercise 4.13 on page 88

Write a recursive version of the function reverse(s) , which reverses the string s in place.

Solutions by Gregory Pietsch & Jesse Weinstein

/* EXERCISE 4-13 Gregory Pietsch */

static void swap(char *a, char *b, size_t n)
{
    while (n--) {
        *a ^= *b;
        *b ^= *a;
        *a ^= *b;
        a++;
        b++;
    }
}

void my_memrev(char *s, size_t n)
{
    switch (n) {
    case 0:
    case 1:
        break;
    case 2:
    case 3:
        swap(s, s + n - 1, 1);
        break;
    default:
        my_memrev(s, n / 2);
        my_memrev(s + ((n + 1) / 2), n / 2);
        swap(s, s + ((n + 1) / 2), n / 2);
        break;
    }
}

void reverse(char *s)
{
    char *p;

    for (p = s; *p; p++)
        ;
    my_memrev(s, (size_t)(p - s));
}

Jesse Weinstein's solution:

/* Recursive string reverse function, without using any setup-wrapper function. 
   Released by Jesse Weinstein, Tue Jul 10 12:37:50 2007 */

void shift(char *s);
void reverse(char *s);

void reverse(char *s) 
{
  int len;
  for (len = -1; s[++len] != '\0'; )
    ;
  if (s[len-1] == '\n')
    len--;
#ifdef DEBUG
  printf("len:%i, s:%s\n", len, s);
#endif
  if (len > 0) {
    reverse(&s[1]);
  }
  if (len > 1) {
    shift(s);
  }
#ifdef DEBUG
  printf("<= len:%i, s:%s\n", len, s);
#endif
}

void shift(char *s) 
{
  int i;
  char tmp;
  tmp = s[0];
  for (i = 0; s[i+1] != '\0'; i++) {
    s[i] = s[i+1];
  }
  s[i] = tmp; /* i is set to the character before the \0; 
		 the last time through the loop sets s[i] to '\0' */
}

int main(void) 
{
  char in[] = "Hello, world!";
  printf("Input: \"%s\"\n", in);
  reverse(in);
  printf("Reversed: \"%s\"\n", in);
  reverse(in);
  printf("Twice reversed: \"%s\"\n", in);
  return 0;
}

These examples are far too complex, here is my basic submission (David Kachlon)

#include <stdio.h>
#include <string.h>

int reverse(char v[], int i, int j)
{
  int temp;
  if(j == 1)
    return 1;
  temp = v[i];
  v[i] = v[j];
  v[j] = temp;
  reverse(v, ++i, --j);
}

main()
{
  char test[] = "David";
  reverse(test, 0, strlen(test)-1);
  printf("%s", test);
}

Added my simple method (Cheng Qi)

#include <stdio.h>
#include <string.h>

int reverse(char v[], int index, int length);

main(){
	
	char test[] = "iqgnehc";
	reverse(test, 0, strlen(test) - 1);
	printf("reversed string is %s\n: ", test);
	return 0;
}


int reverse(char v[], int index, int length){
	if(2 * index > length)	return 	0;
	char temp;
	temp = v[index];
	v[index] = v[length - index];
	v[length - index] = temp;

	reverse(v, ++index, length);
}
Personal tools
Tidy_icons
not logged in