我目前正在學習c語言的遞回。我在嘗試一些東西時遇到了這個
#include <stdio.h>
void draw(int x)
{
if (x > 0)
{
draw(x-1);
for (int i = 0; i < x; i )
{
printf("*");
}
printf("\n");
}
}
int main (void)
{
draw(4);
}
我希望代碼列印出來:
****
***
**
*
相反,它列印:
*
**
***
****
誰能解釋一下為什么會這樣?謝謝你。
uj5u.com熱心網友回復:
這取決于遞回發生的時間!
此代碼示例中發生的情況是遞回呼叫在您實際列印一行之前完成:
draw(3)
-> draw(2)
-> draw(1)
-> draw(0) // not doing anything
-> print one asterisk
-> print two asterisks
-> print 3 asterisks
相反,如果您先列印星號,然后遞回呼叫:
for (int i = 0; i < x; i )
{
printf("*");
}
printf("\n");
draw(x-1); // note: moved behind printing
然后你會得到你最初期望的結果。
旁注:printf("x")與使用putchar('x')which 有效地執行相同操作相比,字串中僅包含一個字符效率非常低(盡管承認,您在運行程式時不會注意到)。
uj5u.com熱心網友回復:
如果您在線擴展每個呼叫,它會有所幫助:
// draw(4) ==
{
// draw(3) ==
{
// draw(2) ==
{
// draw(1) ==
{
// draw(0) ==
{ no-op } ;
print 1 '*' ;
} ;
print 2 '*' ;
} ;
print 3 '*' ;
} ;
print 4 '*' ;
}
draw(4)首先呼叫draw(3),然后列印 4'*'秒。
但是有什么作用draw(3)呢?它呼叫draw(2),然后列印 3'*'秒,依此類推。所以 3'*'秒在 4'*'秒之前列印,2'*'秒在 3'*'秒之前列印,以此類推。
uj5u.com熱心網友回復:
在函式的每次呼叫中,它首先呼叫自身,并減少一個值x(前提x是大于0)
void draw(int x)
{
if (x > 0)
{
draw(x-1);
//...
并且只有在那之后才輸出符號'*' x時間。
如果您想獲得預期的結果,則該函式應首先輸出符號'*' x時間,然后呼叫自身,并減少一個值,x例如
void draw(int x)
{
if (x > 0)
{
for (int i = 0; i < x; i )
{
printf("*");
}
printf("\n");
draw(x-1);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/520648.html
標籤:C递归打印函数定义
下一篇:快速遞回:函式與閉包
