簡體   English   中英

遞歸 function,其中參數以不同的方式傳遞

[英]Recursive function, where the argument is passed in the different ways

有人可以向我解釋這三個代碼塊之間的區別嗎?

#include <stdio.h>

void f(int a)
{
    printf("%d", a);

    if (a >= 1)
        f(--a);

    printf("%d", a);
}

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

Output:32100012

#include <stdio.h>

void f(int a)
{
    printf("%d", a);

    if (a >= 1)
        f(a - 1);

    printf("%d", a);
}

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

Output:32100123

#include <stdio.h>

void f(int a)
{
    printf("%d", a);

    if (a >= 1)
        f(a--);

    printf("%d", a);
}

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

Output:無限打印數字3

    1) printf("%d", a); if (a >= 1) f(--a); printf("%d", a);
       ^^^^^^^^^^^^^^^^ ******************* ^^^^^^^^^^^^^^^^
                        *********** f(2) **

打印兩次,中間a一些東西; 某事包括遞減a 所以f(3)打印3<something_recursive_from_f(2)>2

    2) printf("%d", a); if (a >= 1) f(a - 1); printf("%d", a);
       ^^^^^^^^^^^^^^^^ ********************* ^^^^^^^^^^^^^^^^
                        *********** f(2) ****

打印兩次,中間a一些東西。 所以f(3)打印3<something_recursive_from_f(2)>3

    3) printf("%d", a); if (a >= 1) f(a--); printf("%d", a);
       ^^^^^^^^^^^^^^^^ ******************* ^^^^^^^^^^^^^^^^
                        *********** f(3) **

打印兩次,中間a一些東西; 某事包括遞減a 所以f(3)打印3<something_recursive_from_f(3)>2 ...遞歸的東西又是f(3) ......又是 f(3 f(3) ......又是f(3) ......直到你的電腦燒壞了。

第三個f(a--); 它總是用a == 3調用f ,然后(在 function 返回之后)它將從a中減去1 但永遠不會發生。

第二個 - 它只是用a minus 1調用f ,但不將a打印所有內容從 3 更改為 0,然后當 function 返回第二個打印時,它以相反的順序打印,因為函數在 FIFO 基礎上返回。

第一個與第二個基本非常相似,但a遞減,因此第二個printf打印的結果是0012而不是0123

一些視覺輔助。

考慮第一個代碼示例中發生的情況:

f(3)
-> prints "3"
-> decrements a to 2
-> calls f(2)
   -> prints "2"
   -> decrements a to 1
   -> calls f(1)
      -> prints "1"
      -> decrements a to 0
      -> calls f(0)
         -> prints "0"
         -> prints "0"
      -> prints "0"
   -> prints "1"
-> prints "2"

使用第二個代碼示例:

f(3)
-> prints "3"
-> calls f(2)
   -> prints "2"
   -> calls f(1)
      -> prints "1"
      -> calls f(0)
         -> prints "0"
         -> prints "0"
      -> prints "1"
   -> prints "2"
-> prints "3"

第三個示例代碼:

f(3)
-> prints "3"
-> *post*-decrements a to 2 
-> calls f(3)
   -> prints "3"
   -> *post*-decrements a to 2 
   -> calls f(3)
      -> Oops! Infinite loop.

閱讀前后遞增和遞減運算符之間的區別

暫無
暫無

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

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