C-使用递归退出标准的弦反向


void reverseSentence() 
{ 
    char c; 
    scanf("%c", &c); 
    if(c != 'n') 
    { 
        reverseSentence(); 
        printf("%c", c); 
    } 
}

我不明白的是,如果一次又一次调用递归功能,则控件何时打印函数并打印呼叫堆栈?

要理解此代码,让我们首先查看非反转版本:

void reverseSentence() { 
    char c; 
    scanf("%c", &c); 
    if (c != 'n')
    {
        printf("%c",c); 
        reverseSentence(); 
    }
}

它读取 stdin的字符,如果该字符不是新线,则将其写回。然后,它没有明确地循环,而是通过递归循环循环读取和打印下一个字符:

local> echo "The elephants are coming!" | ./a.out
The elephants are coming!local>

该功能在每次递归中都在读取和打印一个字符。现在,如果我们将这两条线的顺序撤消,如原件:

        reverseSentence(); 
        printf("%c",c); 

同样的事情发生了

local> echo "The elephants are coming!" | ./a.out
!gnimoc era stnahpele ehTlocal>

仍在每次递归上读取并写入一个字符,但利用首先重复出现的事实,然后以相反的顺序处理当前项目。处理当前项目,然后再进行恢复,以远期顺序处理数据。

当函数调用自己时,printf才会搁置,直到完成函数。

使用输入" hi n",它看起来像这样:

scanf -> H
reverseSentence()
    scanf -> i
    reverseSentence()
        scanf -> n
        return
    printf -> i
    return
printf -> H
return

通过调试器踏上可以帮助您理解的。

最新更新