簡體   English   中英

遞歸在這里如何工作?(以下代碼)

[英]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.

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