递归版本的reverse(s)函数,把字符串s颠倒过来

liushac 2009-08-28 05:46:20


/***********************************************************************
Copyright (c) 2009,liushac
All rights no reserved.

Name: <<C程序设计语言>>练习4-13
ID: hello.c
功能: 编写一个递归版本的reverse(s)函数,把字符串s颠倒过来。

Date: Aug 28, 2009

***********************************************************************/
#include <stdio.h>

void reverse(char s[],int longest);
int main()
{
char s1[]="hello";
char s2[]={'w','o','r','l','d','\0'};
int longest=0;

longest=strlen(s1);
reverse (s1,longest);
printf ("%s\n",s1);

longest=strlen(s2);
reverse (s2,longest);
printf ("%s\n",s2);
return 0;
}
/* reverse函数: 把字符串s颠倒过来(递归版本),longest为字符串长度 */
void reverse(char s[],int longest)
{
char c;
int i=0;

if (longest>1)
{
/* 依次交换数组中相邻的数组元素 */
for (i=0;i<longest-1;i++)
{
c=s[i];
s[i]=s[i+1];
s[i+1]=c;
}

longest--;
reverse (s,longest);
}
}


void reverse(char s[],int longest)用到了两个入口参数,如果只用void reverse(char s[]),应该怎么用递归实现?
...全文
1041 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
sean741 2010-09-15
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
void reverse(char str[],int lim)
{
char c;
int i=0;
while(str[i]!='\0')
i++;
i--;
for(int j=0;i>j;i--,j++)
{
c=str[i];
str[i]=str[j];
str[j]=c;
}
}
void main()
{
char str[40];
gets(str);
reverse(str,40);
printf("%s\n",str);
}
thy38 2009-08-28
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 thy38 的回复:]
前些天,一个以前的学生问我怎样用递归把链接倒序,看大家写得热闹,我也贴下我的:
[/Quote]
打错了,是链表,呵呵
thy38 2009-08-28
  • 打赏
  • 举报
回复
前些天,一个以前的学生问我怎样用递归把链接倒序,看大家写得热闹,我也贴下我的:
http://blog.csdn.net/thy38/archive/2009/08/17/4457049.aspx
niimp2 2009-08-28
  • 打赏
  • 举报
回复
呵呵,我的代码还有点瑕疵,自己改改吧.
liushac 2009-08-28
  • 打赏
  • 举报
回复
加完分才看到16#楼的代码,谢谢啊
liushac 2009-08-28
  • 打赏
  • 举报
回复
感谢各位,这里的困惑其实是有关数组的实质,结贴了
niimp2 2009-08-28
  • 打赏
  • 举报
回复
巧了,我也写了个

#include"stdio.h"
void daozhi(char *pstr);
void main()
{
char str[10];
gets(str);
daozhi(str);
}
void daozhi(char *pstr)
{
if(*pstr++ != '\0')
{
daozhi(pstr);
}
printf("%c" , *(pstr-1));
}
Damn_boy 2009-08-28
  • 打赏
  • 举报
回复
一直走到尾巴,
然后把每个字符的输出动作
放在调用函数的后面

Damn_boy 2009-08-28
  • 打赏
  • 举报
回复

#include <stdio.h>

void fun( char *p )
{
if(*p == NULL )
return;

else
{
fun(p+1);
printf("%c",*p);//参数一样
}
}

void main()
{
char p[10]="this is a";

fun(p);
}


这个简单
今天琢磨递归求子集, 要疯了
发现自己是不是脑残了
liushac 2009-08-28
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 mstlq 的回复:]


当把一个数组名当作实参传递给函数内部时,该数组名已经退化成指针了……
所以啊,所谓的传数组名还是传指针,在函数内部时没有任何区别的……
[/Quote]
非常感谢!!!
作为编译器对数组的操作,无非是地址,首地址,偏移,所以这里计较数组和指针已经没有意义了,我这样理解对吗?
mstlq 2009-08-28
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 liushac 的回复:]
        reverse (s+1);
这个怎么理解?数组在这里怎么理解?
[/Quote]

当把一个数组名当作实参传递给函数内部时,该数组名已经退化成指针了……
所以啊,所谓的传数组名还是传指针,在函数内部时没有任何区别的……
liushac 2009-08-28
  • 打赏
  • 举报
回复
reverse (s+1);
这个怎么理解?数组在这里怎么理解?
liushac 2009-08-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 gingzai777 的回复:]
用循环指针不是很好吗
[/Quote]
这是一个练习题,如果没有限制就不复杂,用指针当然好,可要求不用指针,还要用递归实现,我感觉不太好写
mstlq 2009-08-28
  • 打赏
  • 举报
回复
要没有指针?
直接把*s改s[]……
一样的
/***********************************************************************
Copyright (c) 2009,liushac
All rights no reserved.

Name: <<C程序设计语言>>练习4-13
ID: hello.c
功能: 编写一个递归版本的reverse(s)函数,把字符串s颠倒过来。

Date: Aug 28, 2009

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

void reverse(char s[]);
int main()
{

char s1[]="hello";
char s2[]={'w','o','r','l','d','\0'};
int longest=0;

longest=strlen(s1);
reverse (s1);
printf ("%s\n",s1);

longest=strlen(s2);
reverse (s2);
printf ("%s\n",s2);
return 0;
};

/* reverse函数: 把字符串s颠倒过来(递归版本),longest为字符串长度 */
void reverse(char s[])
{
char c;
int i=0;
int longest=strlen(s);

if (longest>1)
{
/* 依次交换数组中相邻的数组元素 */
for (i=longest-1;i>0;i--)
{
c=s[i];
s[i]=s[i-1];
s[i-1]=c;
}

reverse (s+1);
}
}
liushac 2009-08-28
  • 打赏
  • 举报
回复
这里不用指针的话,只用数组作为参数入口,我还没写出来,感觉有难度
liushac 2009-08-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 mstlq 的回复:]
一个函数,楼主想要这样的版本吗?
C/C++ code/***********************************************************************
Copyright (c) 2009,liushac
All rights no reserved.

Name: <<C程序设计语言>>练习4-13
ID: hello.c
功能: 编写一个递归版本的reverse(s)函数,把字符串s颠倒过来。

Date: Aug 28, 2009

***********************************************************************/
#include<stdio.h>
#include<string.h>void reverse(char*s);int main()
{char s1[]="hello";char s2[]={'w','o','r','l','d','\0'};int longest=0;

longest=strlen(s1);
reverse (s1);
printf ("%s\n",s1);

longest=strlen(s2);
reverse (s2);
printf ("%s\n",s2);return0;
};/* reverse函数: 把字符串s颠倒过来(递归版本),longest为字符串长度*/void reverse(char*s)
{char c;int i=0;int longest=strlen(s);if (longest>1)
{/* 依次交换数组中相邻的数组元素*/for (i=longest-1;i>0;i--)
{
c=s[i];
s[i]=s[i-1];
s[i-1]=c;
}

reverse (s+1);
}
}
[/Quote]
这个用到指针了,要没有指针的,呵呵
mstlq 2009-08-28
  • 打赏
  • 举报
回复
一个函数,楼主想要这样的版本吗?
/***********************************************************************
Copyright (c) 2009,liushac
All rights no reserved.

Name: <<C程序设计语言>>练习4-13
ID: hello.c
功能: 编写一个递归版本的reverse(s)函数,把字符串s颠倒过来。

Date: Aug 28, 2009

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

void reverse(char *s);
int main()
{
char s1[]="hello";
char s2[]={'w','o','r','l','d','\0'};
int longest=0;

longest=strlen(s1);
reverse (s1);
printf ("%s\n",s1);

longest=strlen(s2);
reverse (s2);
printf ("%s\n",s2);
return 0;
};

/* reverse函数: 把字符串s颠倒过来(递归版本),longest为字符串长度 */
void reverse(char *s)
{
char c;
int i=0;
int longest=strlen(s);

if (longest>1)
{
/* 依次交换数组中相邻的数组元素 */
for (i=longest-1;i>0;i--)
{
c=s[i];
s[i]=s[i-1];
s[i-1]=c;
}

reverse (s+1);
}
}
Zijian_Zhang 2009-08-28
  • 打赏
  • 举报
回复
用循环指针不是很好吗
liushac 2009-08-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 victor_dinho 的回复:]
重载一个reverse

C/C++ code/***********************************************************************
Copyright (c) 2009,liushac
All rights no reserved.

Name: <<C程序设计语言>>练习4-13
ID: hello.c
功能: 编写一个递归版本的reverse(s)函数,把字符串s颠倒过来。

Date: Aug 28, 2009

***********************************************************************/
#include<stdio.h>
#include<string.h>void reverse(char s[],int longest);void reverse(char s[]);int main()
{char s1[]="hello";char s2[]={'w','o','r','l','d','\0'};

reverse(s1);
printf("%s\n",s1);

reverse(s2);
printf("%s\n",s2);return0;
}/* reverse函数: 把字符串s颠倒过来(递归版本),longest为字符串长度*/void reverse(char s[])
{int longest= strlen(s);
reverse(s, longest);
}void reverse(char s[],int longest)
{char c;int i=0;if (longest>1)
{/* 依次交换数组中相邻的数组元素*/for (i=0;i<longest-1;i++)
{
c=s[i];
s[i]=s[i+1];
s[i+1]=c;
}

longest--;
reverse (s,longest);
}
}
[/Quote]
顶一下,学习了
能在一个函数里解决吗
Victor_Dinho 2009-08-28
  • 打赏
  • 举报
回复
重载一个reverse


/***********************************************************************
Copyright (c) 2009,liushac
All rights no reserved.

Name: <<C程序设计语言>>练习4-13
ID: hello.c
功能: 编写一个递归版本的reverse(s)函数,把字符串s颠倒过来。

Date: Aug 28, 2009

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

void reverse(char s[],int longest);
void reverse(char s[]);

int main()
{
char s1[]="hello";
char s2[]={'w','o','r','l','d','\0'};

reverse(s1);
printf("%s\n",s1);

reverse(s2);
printf("%s\n",s2);
return 0;
}
/* reverse函数: 把字符串s颠倒过来(递归版本),longest为字符串长度 */

void reverse(char s[])
{
int longest = strlen(s);
reverse(s, longest);
}

void reverse(char s[],int longest)
{
char c;
int i=0;

if (longest>1)
{
/* 依次交换数组中相邻的数组元素 */
for (i=0;i<longest-1;i++)
{
c=s[i];
s[i]=s[i+1];
s[i+1]=c;
}

longest--;
reverse (s,longest);
}
}
加载更多回复(2)

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧