用递归的思想写编写一个函数reverse_string(char * string)实现字符串反向输出和反向排列



字符串反向输出:

#include<stdio.h>
void reverse_string(char *string)
{
	   if ('\0'!=*(++string))
		reverse_string(string);//递归调用,每次调用都要输出
	    printf("%c",*(string-1));
}

int main()
{
	char *a = "abcde";
	reverse_string(a);
	printf("\n");
	return 0;
}

每次调用 递归 编译器就会归 函数重新分配一片空间来放这个函数 直至 if 条件不成立

内存中类似以上这种图 最里层以这个函数为例 就是 *string=='\0'了就执行 printf("%c",*(string-1)) 把最后一个 字符打印出来 ,而此时右跳入次里层,*string的值是'\0'前边的字符,紧接又输出 以此类推


字符串反向排列:

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

char* reverse1(char *str) //字符串反向排列,自己函数strlen()
{
     char *p=str;
	int n=0;
	 while(*p++!='\0')
	 {
	    n++;
	 }
 if(n>1)
  {
    char temp=str[0];
	str[0]=str[n-1];
	str[n-1]='\0';
    reverse1(str+1); 
	str[n-1]=temp;
  
  }
  return str;
}

char * reverse(char *str) //字符串反向排列,用库函数strlen()
{ 
	int len = strlen(str);  
	if( !*str ) 
	{ 
		return NULL; 
	}  
	if( len > 1 ) 
	{ 
		char ctemp =str[0];
		str[0] = str[len-1];
		str[len-1] = '\0';// 最后一个字符在下次递归时不再处理 
		reverse(str+1); // 递归调用 
        str[len-1] = ctemp; 
} 
	 return str;
}

int main()
{
    char string[]="123456";
    printf("String=%s\n",reverse1(string));
    printf("String=%s\n",reverse(string));
	return 0;
}
 

如上图所示,每次进入递归计算一次新的字符串长度,紧接着这个新字符串的最后一个元素就会被赋值为\0,每次空间就会建立一个临时变量temp,来存储新字符串第一个元素的值,因为每次交换第一个字符就会将最后一个自负的值赋于新的字符串的首元素,而首元素的值直到退出递归时才会有临死变量赋给每个新字符串的最后一个元素

最终递归不继续压栈即将退栈时数组内部的存储图如下图

待到退栈时候每次空间的临时变量就会把值分别赋给str[3]  str[4]  str[5]这就实现了交换

     6                5                3          2           1      \0




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值