巧妙运用递归实现字符串的倒序输出

要想让输入的字符串倒序输出有很多种方法,我们可以用字符串处理函数,也可以将字符数组内的元素进行交换,在这里,我们用递归的方式来封装一个可以将字符串倒序输出的函数。

首先我们知道,递归程序层层递归,在递归之后的程序一定是最后才执行的,既然我们要倒序打印字符串,第一个字符一定是最后才打印的,然而很巧的是,我们这个倒序输出函数传址传的也是第一个字符的地址,所以我们就可以写成

void reverse_string(char* string)
{
    
    
   reverse_string(string+1);	
   printf("%c",*string);
}

但是递归是需要条件的,若没有条件,则会无限递归下去,我们得找一个条件让它停下来。
我们知道,字符串的最后一个字符是 ’ \0 ’ ,那么当我们遇见 ’ \0 ',是不是就意味着就不用继续调用递归了呢?
假设可以,我们来试试结果

void reverse_string(char* string)
{
    
    
   if(*(string)!='\0')
   {
    
    
      reverse_string(string+1);
   }	
   printf("%c",*string);
}

如果递归到最后一个字符时, string + 1 就是 ‘\0’ 的地址,当不满足条件,将从 ‘\0’ 开始打印,那我们所作的努力都会前功尽弃。所以我们就得在确保第一个字符不是 *’\0’*的情况下判断下一个字符到底是不是 ‘\0’
可以写成

void reverse_string(char* string)
{
    
    
   if(*(string+1)!='\0')
   {
    
    
      reverse_string(string+1);
   }	
   printf("%c",*string);
}

也可以写成

void reverse_string(char* string)
{
    
    
	if (*(++string) != '\0')
	{
    
    
		reverse_string(string);
	}
	printf("%c",*(string-1));
}

通过这样的层层递归,最终我们得到了我们想要的结果。

下面是这个递归程序的原理图以及供参考的代码:

void reverse_string(char* string)
{
    
    
	if (*(++string) != '\0')
	{
    
    
		reverse_string(string);
	}
	printf("%c",*(string-1));
}
int main()
{
    
    
	char arr[10] = "";
	scanf("%s",arr);
	reverse_string(arr);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_52606524/article/details/113056750