簡體   English   中英

使用 while 循環 vs if 語句使用遞歸解釋來反轉字符串

[英]Using while loop vs if statement to reverse a string using recursion explanation

所以我無法理解在這個程序中使用 if 語句來反轉字符串的邏輯,while 循環不應該類似地執行任務,但是當你替換if((c=getchar())!='\n')while((c=getchar())!='\n')它只打印字符串的最后一個字符。 我需要幫助了解在這兩種情況下這種遞歸的工作方式有何不同。

    #include <stdio.h>
void wrt_t(void);
int main(void)
{
    wrt_t();
    putchar('\n');
    return 0;
}

void wrt_t(void){
    int c;
    if((c=getchar())!='\n'){
            wrt_t();
    }
            
    putchar(c);
}
if ((c = getchar()) != '\n') {
      wrt_t();
}

如果使用if語句,則每次遞歸只會獲取一個字符。 如果它不是換行符( \n ),它會進入下一個最深的遞歸級別,並且在此級別中提取的字符尚未打印。

當最終到達輸入中提供的換行符時,輸入字符的順序將被反向打印,因為最深(最后一個)遞歸級別首先打印其獲取的字符,因此順序上升到最高遞歸級別。

在每個更高的遞歸級別中,除了打印在該遞歸級別獲取並返回到下一個最高遞歸級別的字符外,沒有什么比做更多的事情了。

結果是字符的輸入,直到以相反的順序找到第一個換行符。


while ((c = getchar()) != '\n') {
      wrt_t();
}

當您改用while循環時,行為會有所不同。 在最深遞歸級別最終到達換行符后,它將打印輸入的最后一個字符(在最后一個遞歸級別獲取的字符),返回到下一個最高遞歸級別並迭代相應的while循環,直到找到另一個換行符在輸入中跳出循環並返回到下一個最高遞歸級別。

如果您沒有在輸入中提供與遞歸級別一樣多的換行符,則整個遞歸的展開將卡住。

例如,對於像"hello"這樣的 5 個字符的輸入,您需要 6 個尾隨換行符才能退出遞歸:

hello\n\n\n\n\n\n

請注意,在這種情況下,output 會出現類似的錯誤。 它將僅打印 6 個換行符,因為附加的換行符會覆蓋先前存儲在每個遞歸級別的相應c變量中的字符。

在您的情況下,如果它只有一個換行符,它只會打印從最深遞歸級別獲取的輸入的最后一個字符(實際上是換行符)並等待更多輸入。


除此之外,如果您收到輸入錯誤並且getchar()返回EOF ,您將在任何遞歸級別中獲得無限循環。

在您的代碼中,變量c 既不是數組也不是指針,因此您無法在其中存儲所有字符。

一旦 c 將字符存儲為輸入,如果再次聲明它,則新輸入將與前一個重疊

所以最后存儲在變量 c 中的只是最后一個字符。

這是你可以做到的方式:

#include <stdio.h>
#include <stdlib.h>

//function declarations
int getInput();
void print_reverse_input(int i,char* str);

//global declarations
int i=0;
char c;
char str[20];
int main()
{
    int p;
    p= getInput();
    print_reverse_input(p,str);
    return 0;
}
int getInput()
{
    if((c=getchar())!='\n')
    {
        str[i]=c;
        ++i;
        getInput();
    }
    return i;
}
void print_reverse_input(int i,char* str)
{
    int j;
    for(j=i;j>=0;j--)
    printf("%c",str[j]);
}

暫無
暫無

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

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