天天看點

C語言程式設計 遞歸方法與非遞歸方法 實作将參數字元串中的字元反向排列

//題目要求要求:不能使用C函數庫中的字元串操作函數

(否則本題也沒什麼意義了啊)

<1>非遞歸方法

此方法基本思想是設立兩個指針,分别指向字元串的頭尾

并且依次交換所指向的資料,代碼中為left和right

源代碼:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>//因為要使用strlen()語句
void reverse_string(char str[])
{
    int temp;
    char *left = str;
    char *right = str + strlen(str) - 1;
    while (*left <* right)
    {
        temp = *left;
        *left = *right;
        *right = temp;
        *right--;
        *left++;
    }
}
int main()
{
    char str[] = "chooseyou";
    printf("%s\n", str);
    reverse_string(str);
    printf("%s", str);
    system("pause");
    return 0;
}           

<2>遞歸方法

遞歸方法思想如下圖

類似于非遞歸的left與right指針所指資料互換

遞歸時隻訂立一個指針,每一次通過未交換字元串的長度(len)來表示所指向的元素的字元串倒數除\0外第一個元素。

每一次的遞歸将指針所指的元素儲存進一個變量,并且将倒數第一個元素(除\0外),與所知元素換再把最後元素置為\0,然後改變len進行下次遞歸。

最後的效果是字元串由長變短再變長得以完成反向排列

詳解如圖

#include<stdio.h>
#include<stdlib.h>
void reverse_string(char *str)
{
    int len = strlen(str);
    char temp=*str;//目前所指元素
    *str = *(str + len - 1);//除\0外最後一個元素
    *(str + len - 1) = '\0';//置\0
    if (strlen(str + 1) >= 2)//長度小于等于1則不需要交換
    {
        reverse_string(str + 1);
    }
    *(str + len - 1) = temp;//将儲存的元素反序序放回字元串完成反向排序
}
int main()
{
    char str[] = "chooseyou";
    printf("%s\n", str);
    reverse_string(str);
    printf("%s\n", str);
    system("pause");
    return 0;
}