1. 程式人生 > >用遞迴的思想寫編寫一個函式reverse_string(char * string)實現字串反向輸出和反向排列

用遞迴的思想寫編寫一個函式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