簡體   English   中英

反向字符串中的遞歸執行

[英]recursion execution in reverse string

#include <stdio.h>
#define MAX 100
char *reverse(char[]);

int main()
{
    char str[MAX], *rev;
   enter code here //printf("Enter a String: ");
    scanf("%s", str);
    rev = reverse(str); 
    printf("The reversed string is : %s\n", rev);
    return 0;
}

char* reverse(char str[])
{
    static int i= 0;
    static char rev[MAX];
    if (*str)
    {
        reverse(str+1);
        rev[i++]= *str;
    }
    return rev;
}

function反向執行是如何發生的......請舉例說明執行的每個步驟謝謝

function逆向的要點是遞歸。 如您所知,遞歸 function 是從自己的代碼中調用自己的函數。 通常,每次調用都比前一次調用的“問題”小。

讓我們看看 function。我們有兩個 static 變量,它們是 static,所以正如 dxiv 在評論中所說,它們將在第一次初始化后“保留”它們的值。 但在某些情況下,“靜態”變量也是一個需要處理的問題。

現在我們有一個 if 來檢查字符串中是否還有一些字符。 這意味着如果我們到達字符串的末尾,if 中的代碼將不會被執行。

讓我們看一下這個例子:

在此處輸入圖像描述

我添加了一個 printf 來每次檢查字符串內容,如您所見,function 轉到字符串的最后一個元素(如果我們將其視為數組),一旦到達末尾,它就會開始執行下一條指令. 所以 function 會調用自己,增加 str 時間:

reverse(str + 1);

一旦我們到達 str 的末尾,程序將通過以下指令傳遞:將一個 char 分配給反向數組,在這種情況下將從零開始,因為計數器變量 i 仍為 0。

返回值僅在末尾而不是在遞歸“階段”期間被考慮。

至此游戲結束,棧中的function遞歸調用將被一一移除,現在每一個都可以添加反向數組中的字母。 這樣做我會增加,我們每次都在考慮字符串中的字母。

這樣,最后我們就得到了反轉的字符串。

一些技巧:

  • 使用 fgets(..., ..., ...) 而不是 scanf ,這樣您就可以使用句子而不是只說一個詞。 但是還有一些其他的優勢,我讓你發現。
  • 通常,該返回值也應在遞歸過程中使用
  • 就個人而言,我更喜歡在遞歸 function 中沒有 static 變量(除非我真的需要它)。 我更喜歡(如果可能的話)我需要的變量作為參數。

我將在下面附上帶有 fgets(...) 的代碼:

#include <stdio.h>
#include <string.h>
#define MAX 100

char *reverse(char[]);

int main() {
    char str[MAX], *rev;
    printf("Enter a String: ");
    fgets(str, sizeof(str), stdin);
    str[strcspn(str, "\n")] = '\0';
    
    rev = reverse(str);
    printf("The reversed string is: %s\n", rev);
    return 0;
}

char *reverse(char str[]) {
    static int i = 0;
    static char rev[MAX];
    if (*str) {
        reverse(str + 1);
        rev[i++] = *str;
        printf("\n%s", str);
    }
    return rev;
}

我真的希望這可以幫助你:D

最好的問候,丹尼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM