绞尽脑汁也想不出解法,请教递归算法!
编写函数reverse(char *s), 用递归算法使字符串S倒序(是将主程序那儿的字符串值顺序倒过来,而不仅仅是倒序显示出来)。
——————————————————————————————————————————
我想了几个小时了也想不出个好点的算法来。 我是不是太笨了,不是做程序员这块料啊?
问题点数:20、回复次数:21Top
1 楼lzp229(只想飞)(卡卡)回复于 2005-12-15 17:16:42 得分 2
(是将主程序那儿的字符串值顺序倒过来,而不仅仅是倒序显示出来)。
按照楼主的要求,你的主程序中应该是定义的数组吧,但是你只传reverse(char *s)地址,怎么确定字符串什么时候结束呢。。Top
2 楼waini11(王子)回复于 2005-12-15 17:20:44 得分 0
倒叙还不简单Top
3 楼chenang(cha)回复于 2005-12-15 17:25:49 得分 0
一定要用递归吗,直接交换会更快Top
4 楼waterczh(三十年河东三十年河西,我TMD是掉到河里了)回复于 2005-12-15 17:41:50 得分 0
前几天好象有个倒转链表的贴子,可以去看看Top
5 楼waterczh(三十年河东三十年河西,我TMD是掉到河里了)回复于 2005-12-15 18:02:58 得分 0
思考ingTop
6 楼happy__888([顾问团]寻开心 www.e-jjj.com)回复于 2005-12-15 18:07:41 得分 5
#include "stdio.h"
#include "string.h"
void reverse(char * s)
{
int l = strlen(s);
char c = s[l-1];
memmove(s+1, s, l-1);
s[0]=c;
if ( *( s+1) ) reverse(s+1);
}
main()
{
char a[] = "abcdef";
reverse(a);
printf("%s", a);
return 0;
}Top
7 楼happy__888([顾问团]寻开心 www.e-jjj.com)回复于 2005-12-15 18:08:31 得分 0
每次把字符串的最后一个字符,移动到最前面
然后递归处理子串就是了Top
8 楼sankt(宠辱不惊,看庭前花开花落;去留无意,望天空云卷云舒.)回复于 2005-12-15 18:34:16 得分 5
#include<iostream>
#include<algorithm>
using namespace std;
char str_5[12];
void reverse_3(char *str)
{
static int count=0;
if(*str=='\0')
{
return ;
}
else
{
reverse_3(str+1);
cout<<*str;
str_5[count++]=*str;
}
}
int main()
{
char str_3[]="yishangshao";
memset(str_5,0,12);
reverse_3(str_3);
cout<<endl;
strcpy(str_3,str_5);
cout<<str_3<<endl;
system("pause");
return 0;
}
Top
9 楼csucdl(csucdl)回复于 2005-12-15 18:44:36 得分 0
对了,不过思路应该有多种Top
10 楼province_(雍昊)回复于 2005-12-15 19:13:09 得分 0
这个问题用递归简直是杀鸡用牛刀。头尾向中间移动,边移边交换多快啊。Top
11 楼boxer_tony()回复于 2005-12-15 19:39:03 得分 2
#include <stdio.h>
#include <string.h>
__inline void Swap(char &a, char &b)
{
char temp;
temp = a;
a = b;
b = temp;
}
void Reverse0(char *str, int len)
{
if(len <= 1)
return;
else
{
Swap(str[0], str[len-1]);
Reverse0(str+1, len-2);
}
}
void Reverse(char *str)
{
int len = strlen(str);
Reverse0(str, len);
}
Top
12 楼FarFarAway()回复于 2005-12-15 20:09:49 得分 2
#include <iostream>
#include <stdio.h>
#include <string>
using namespace std;
void Reverse( char * str,size_t N )
{
if ( N <= 1 )
return;
char* tempStr = &str[1];
Reverse( tempStr, N-2 );
char temp;
temp = str[0];
str[0] = str[N-1];
str[N-1] = temp;
}
int main()
{
char* str = new char[25];
strcpy( str,"hello,how are you?" );
Reverse( str, strlen( str ) );
cout << str << endl;
return 0;
}Top
13 楼FarFarAway()回复于 2005-12-15 20:19:02 得分 0
在main()里落下一句:delete [] str;Top
14 楼ugvihc(maybe good good study, hope day day up!)回复于 2005-12-15 20:38:40 得分 0
直接交换就行了.
reverse(char *s)
{
strrev(s);
}Top
15 楼sinall()回复于 2005-12-15 20:42:00 得分 0
#include <stdio.h>
#include <string.h>
char* reverse(char *s);
int main()
{
char str[] = "asdf";
printf("%s\n", reverse(str));
}
char* reverse(char *s)
{
if (*s != '\0')
{
char temp;
temp = *(s + strlen(s) - 1);
for (char *p = s + strlen(s) - 1; p > s; --p)
{
*p = *(p-1);
}
*s = temp;
reverse(s+1);
}
return s;
}Top
16 楼sinall()回复于 2005-12-15 20:45:17 得分 0
恩,memmove,学习一下……Top
17 楼weping(无语)回复于 2005-12-16 17:55:13 得分 0
谢谢大家热心回复, 学习了!Top
18 楼caokestudy(ck)回复于 2005-12-16 19:12:12 得分 2
# include <iostream.h>
char c[]="abcdef";
void cao(int i)
{if (c[i]!='\0')
cao(i+1);
cout<<c[i];
}
void main()
{cao(0);}Top
19 楼chengzanmiao(高薪為共產當多納稅)回复于 2005-12-16 19:28:45 得分 0
happy__888([顾问团]寻开心)
============================================
的思路有問題吧。把最后一個拉到第一個,結果還是沒倒序啊。。。Top
20 楼huauh2o(扑克王子)回复于 2005-12-18 21:29:12 得分 2
我的两个基本上一样:
#include<stdio.h>
char* reverse1( char *s )
{
char ch;
static int i = 0;
static int j = 0;
if( !s[i] )
return NULL;
ch = s[i];
i++;
reverse1(s);
s[j++]= ch ;
return s;
}
第二个:
char* reverse( char *s )
{
char ch;
static char *q = s;
static char *p = s;
if( !*s )
return NULL;
ch = *s;
reverse(++s);
*(q++) = ch;
return s;
}
void main()
{
char test[]= "hujinshui";
puts(reverse(test));
}
Top
21 楼afei_xyd(阿飞)回复于 2005-12-19 09:05:57 得分 0
happy__888([顾问团]寻开心)
的算法没有问题,我试了Top




