簡體   English   中英

有人可以解釋一下這種類型的遞歸是如何工作的嗎?

[英]Can someone please explain me how this type of recursion works?

我在遞歸中遇到了這個問題。 我無法弄清楚它是如何工作的。 我理解遞歸的基礎知識但這完全讓我感到困惑。 請幫忙。

main() { 
    foo(3); 
}

void foo(int x) {
    if (x >= 1) {
        foo(--x);
        printf("%d", x);
        foo(--x);
    }
}

我認為這個程序不打印任何東西,但它打印0120

是不是第一次調用foo( - 3)即foo(2)跳轉到函數的開頭並重復直到3遞減到0?

請解釋這是如何工作的。

可以使用遞歸樹來解釋對foo()的第一次調用:

  prints (in reverse order)

    2 <----------  foo(3)
                  /      \
    1 <----- foo(2)       foo(1) -----> 0
             /   \        /     \
    0 <-- foo(1) foo(0)  foo(0)  foo(-1)
         /    \ 
      foo(0)   foo(-1)

首先,將評估左子樹並將打印012 ,然后將評估右子樹並將打印0 最后你得到輸出:

0120

所以foo(3)是:

foo(2)
print 2
foo(1)

foo(2)是:

foo(1)
print 1
foo(0)

foo(1)是:

foo(0)
print 0
foo(-1)

現在foo(0)和foo(-1)都是no-ops,所以foo(1)是:

print 0

從那以后foo(2)是:

print 0
print 1

foo(3)是:

print 0
print 1
print 2
print 0

這為您提供了觀察到的輸出。

這是預期的產出。 下一個函數調用被推送到堆棧,並且在前一個函數調用返回之前不會執行printf語句。

foo(3) --> foo(2) --> foo(1) --> foo(0)

現在x不是> = 1,所以不再有函數調用,而foo(0)會彈出堆棧。 執行來自foo(1)的printf語句,0(因為x值遞減)轉到stdout。 另一個foo()調用:

foo(3) --> foo(2) --> foo(1) --> foo(-1)
                             //  ^^ second foo() call from foo(1)

電流輸出:

0

這沒什么。 foo(-1)和foo(1)彈出堆棧。
現在printf從foo(2)調用,1進入stdout。

叫foo(0)。

foo(3) --> foo(2) --> foo(0)
                  //  ^^ second foo() call from foo(2)

電流輸出:

01

foo(0)什么都不做,然后彈出堆棧的foo(0)和foo(2)。

現在我們在foo(3)。 打印2並調用foo(1)。

foo(3) --> foo(1)
       //  ^^ second foo() call from foo(3)

電流輸出:

012

foo(1)調用foo(0)然后打印0然后調用foo(-1)。 現在所有剩余的foo都彈出了堆棧,輸出時得到0120。


@haccks - 看這個程序。 有調用foo(-1)。

#include <stdio.h>

void foo(int);

int main() { 
    foo(3); 
    return 0;
}

void foo(int x) {
    if (x >= 1) {
        printf("executing foo with x = %d\n",x-1);
        foo(--x);
        printf("original output: %d\n", x);
        printf("executing foo with x = %d\n",x-1);
        foo(--x);
    }
}

輸出:

executing foo with x = 2
executing foo with x = 1
executing foo with x = 0
original output: 0
executing foo with x = -1
original output: 1
executing foo with x = 0
original output: 2
executing foo with x = 1
executing foo with x = 0
original output: 0
executing foo with x = -1

暫無
暫無

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

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