簡體   English   中英

如何返回遞歸function在C++中被調用了多少次?

[英]how to return how many times has a recursive function been called in C++?

void funct(int n)
{
    int steps = 0;
    if(n != 1){
        steps++;
        if((n % 2) == 0){
            funct(n/2);
        }
        else if((n % 2) != 0){
            funct((3*n + 1));
        }
        cout << steps << " ";

    }
    
}

我試過這段代碼,但每次都打印 1; 我希望我的代碼打印它被調用了多少次。

stepsfunct中的局部變量,每次調用funct都有自己的副本。 您需要通過對funct的所有調用傳遞單個變量才能正確計數。

void funct(int n, int& steps)
{
    if(n != 1){
        steps++;
        if((n % 2) == 0){
            funct(n/2, steps);
        }
        else if((n % 2) != 0){
            funct((3*n + 1), steps);
        }
    }
}
int main()
{
   int steps = 0;
   funct(5, steps);
   cout << steps << "\n";
}

就目前而言,您的 function 中的steps變量是一個自動存儲持續時間的局部變量。 后者意味着它將在每次調用 function 時重新初始化為零。

您可以將static關鍵字添加到聲明中,以便僅在第一次調用 function ( cppreference ) 時進行初始化(為零),並且從那時起,修改后的值將在 function 的后續調用中保持不變(直到或除非它被明確重置1 )。

然而,即便如此,如果您想查看“滾動”計數,您需要在進行任何遞歸調用之前放置cout行(報告值的位置)。

這是一種可能性(我還將您的測試條件從n != 1更改為n > 1 ,以防止在對您的問題的評論中提到的潛在無限遞歸):

void funct(int n)
{
    static int steps = 0; // Initialized only the first time this line is reached
    if (n > 1) {
        steps++;
        std::cout << steps << " ";
        if ((n % 2) == 0) {
            funct(n / 2);
        }
        else if ((n % 2) != 0) {
            funct((3 * n + 1));
        }
    }
}

1實現此“顯式”重置的一種方法是在遞歸鏈完成時在else塊中執行此操作。 以下代碼展示了如何執行此操作,以及一個簡短的main代碼,展示了該行為如何在對funct的多個連續“頂級”調用上起作用:

#include <iostream>

void funct(int n)
{
    static int steps = 0;
    if (steps == 0) {
        std::cout << "Top-level call with " << n << "... ";
    }
    if (n > 1) {
        steps++;
        std::cout << steps << " ";
        if ((n % 2) == 0) {
            funct(n / 2);
        }
        else if ((n % 2) != 0) {
            funct((3 * n + 1));
        }
    }
    else {
        std::cout << std::endl;
        steps = 0;
    }
}

int main()
{
    funct(5);
    funct(9);
    funct(8);
    return 0;
}

Output:

Top-level call with 5... 1 2 3 4 5
Top-level call with 9... 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
Top-level call with 8... 1 2 3

另一種方法是使用“特殊”值(例如負數)來更改 function 的行為,這樣,如果傳遞了這樣的值,function 會將steps重置為零,然后立即返回。

讓 function 返回它被調用了多少次。 這總是比遞歸調用報告的調用次數多一個:

int funct(int n)
{
    int steps = 0;
    if(n != 1){
        if((n % 2) == 0){
            steps = funct(n/2);
        }
        else {
            steps = funct((3*n + 1));
        }
    }
    return steps + 1;
}

int main()
{
   int steps = funct(5);
   cout << steps << "\n";
}

暫無
暫無

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

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