Mickey Mathieson a écrit :
> I am new to the group and have noticed a lot of questions of 
> recursion.
> A problem that is suitable for recursion should produce a smaller 
> function that if the problem was solved without recursion. This has
> not been the case from the postings that i have looked at. 
>
> I have provided an example of recursion done correctly to reverse a 
> string. Notice how short and compact the code is. This is the object
> of recursion - less code at the expense of more memory being used.
>
> Mickey M.
> senior software engineer
> http://www.constructionpartner.com
>
>
> // Reverse String
> char *RevStr(int count, char *str)
> {
>  char Value;
>
>  if (count)
>  {
>               Value = str[count-1];
>               RevStr(count-1, str);
>       }
>
>       if (count)
>   
this test has no use, since count did not change since the last test

>               str[strlen(str) - count] = Value;
>
>       return(str);
> }
>   

To made even shorter (and poor efficiency... strlen is called far too 
often, hope you newer reverse very long string)
char *RevStr(int c, char *str) {
    if (c)  {
        char Value = str[c-1];   // some C compiler could complain about 
inside declaration of Value
        str[ strlen( RevStr( c-1, str ) ) - c] = Value;   // strlen is 
stable
    }
    return(str);
}

A simple iterative one could be (IMHO far more efficient else there is a 
bug)

char* reverse( char* str ) {
    char* begin = str, *end = str;
    while( *end ) ++end;    // go to the end
    while( end > begin ) {  // swap begin and end until they join
        char c = *--end;
        *end = *begin;
        *begin++ = c;
    }
    return str;
}

and a C++ one could be (a one line)
std::reverse( str, str + strlen( str ) );
> int main(int argc, char* argv[])
> {
>
>       char Test[20] = "ABCDEFGHIJK";
>       char Out[20];
>
>       strcpy(Out,RevStr(strlen(Test), Test));
>
>
>       return 0;
> }
>
>   

A function like Ackermann could have been a better example of 
recursivity efficiency.

When I tought about it, I wonder if this is not a fake to hide some 
homework...

Regards,
David

Reply via email to