[英]How does recursion work here?(Below Code)
#include<stdio.h>
void func(int x)
{
if (x==0)
return;
else
{
func(--x);
printf("%d\t",x);
}
}
void main()
{
int k=2;
func(k);
}
輸出: 0 1
為什么輸出不為0 1 2
?
首次調用該函數時, x
的值等於2。然后應在最后將其打印出來。 我對此代碼感到困惑。 有人可以幫我嗎?
--x
減小x的值,然后在打印之前執行該操作; 這就是為什么輸出是0 1
而不是0 1 2
。
對於初學者來說,將參數聲明為unsigned int
類型會更正確。 否則,將參數減小為負值會導致很長的輸出序列。
在該函數的每個遞歸調用中,參數首先減小,減小后將打印輸出。
func(--x);
^^^^
printf("%d\t",x);
因此,如果最初使用等於2
的參數調用該函數,則由於參數已減小,因此它將輸出值1
。
從而
func( 2 ) --> outputs 1
func( 1 ) --> outputs 0
func( 0 ) --> outputs nothing
只有最里面的函數調用首先輸出它的值。
如果您希望輸出看起來像
0 1 2
然后應該定義功能,如本演示程序中所示
#include <stdio.h>
void func( unsigned int x )
{
if ( x ) func( x - 1 );
printf( "%u\t", x );
}
int main(void)
{
func( 2 );
putchar( '\n' );
}
函數輸出為
0 1 2
該函數與原始函數的不同之處在於,參數本身不會在函數調用中減少。 它保持其值不變。
if ( x ) func( x - 1 );
^^^^^^ the variable x itself is not changed
如果遞歸調用發生在方法的開頭,則稱為頭遞歸。 該方法在進入下一個遞歸調用之前保存狀態。
您只需要在printf之后交換遞歸調用即可。
#include<stdio.h>
void func(int x){
if(x==0){printf("%d\t",x);
return;}
else{
func(--x);
printf("%d\t",x+1);
}
}
int main(){
int k=2;
func(k);
}
在此,每次減小x
第一個值並將其推入堆棧,直到x == 0,然后按初始遞歸函數調用的確切相反順序累積最終結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.