題目大意是這樣的:給定一個字串使用遞回的方法將字串逆序,注意是不是逆序列印,并不使用string.h的庫函式
思路:字串逆序首先要知道字串陣列的長度,又不能呼叫庫函式,顧需要自己寫一個能實作strlen的函式,使逆序函式呼叫,所以需要兩個函式:
1. 能求出字串陣列長度的陣列
2. 實作字串逆序的函式(呼叫第一個函式來得到陣列長度)
實作第一個函式:
這個函式其實很簡單可以用遞回來實作也可以用回圈來實作我這里就直接放出原始碼了
遞回實作:
int my_strlen(char *p)
{
int n = 0;
if (*p != '\0')
{
return 1+my_strlen(p + 1);
}
else
{
return 0;
}
}
回圈實作
int my_strlen(char* p)
{
int n = 0;
while (*p != '\0')
{
n += 1;
p++;
}
return n;
}
實作第二個函式:
假設我們要使字串“abcdefg”逆序,逆序實際上是交換首尾的字符,顧設第一個字符和最后一個字符分別序號為 left =0 和 right=my_strlen§-1 ,將最右邊的字符即p[right]與p[left]交換,然后遞回fun(p+1),但是如果這樣做,我們會發現左邊邊的指標移向了下一位,但是右邊的還停留在上一個,而如果要使做右邊指標移動必須知道遞回次數,這樣非常不方便,如圖
void reverse(char* p)
{
int left = 0;
int right = my_strlen(p)-1;
char temp;
temp = p[left];
p[left] = p[right];
p[right] = temp;
reverse(p+1);
}
如果右邊指標能隨著遞回次數增加而自己往左邊移動這個問題就迎刃而解了,這時就有一個巧妙的方法:
我們將p[left]的值存入temp, 并將p[right]賦值給p[left], 然后令p[right]=’\0’
void reverse(char* p)
{
int left = 0;
int right = my_strlen(p)-1;
char temp;
temp = p[left];
p[left] = p[right];
p[right] = '\0';
reverse(p + 1);
p[right] = temp;
}
這樣p+1進入下一次遞回時,由于my_strlen()函式只能回傳’\0’前字符的個數, 使p[right]指標往左移了一位效果如圖

這是進行了多次遞回,如果沒有對遞回進行限制函式會進入死回圈,顧要滿足一定條件才能進入reverse(p+1),而這個條件很明顯是my-strlen§>1,如果字串長度小于一就沒有交換的必要了,

void reverse(char* p)
{
int left = 0;
int right = my_strlen(p)-1;
char temp;
temp = p[left];
p[left] = p[right];
p[right] = '\0';
if (right>0)
{
reverse(p + 1);
}
p[right] = temp;
}
最終遞回的流程如圖:

最終代碼:
#include<stdio.h> //遞回使字串逆序
int my_strlen(char *p)
{
int n = 0;
if (*p != '\0')
{
return 1+my_strlen(p + 1);
}
else
{
return 0;
}
}
void reverse(char* p)
{
int left = 0;
int right = my_strlen(p)-1;
char temp;
temp = p[left];
p[left] = p[right];
p[right] = '\0';
if (right>0)
{
reverse(p + 1);
}
p[right] = temp;
}
int main()
{
char arr[] = "abcdefg";
reverse(arr);
printf("%s", arr);
return 0;
}
有錯誤歡迎大家指正,謝謝
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/279300.html
標籤:其他
上一篇:【CentOS 后遺癥】你的Linux系統肯定用不了吧!不信你試試!
下一篇:java核心之類和物件
