[英]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(...) 的代碼:
#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.