簡體   English   中英

如何最小化調用遞歸函數的次數

[英]How to minimize the times a recursive function is called

因此,對於以下代碼,我試圖減少函數調用自身的時間,以便它更有效。 代碼的目的是使用遞歸執行取冪。

int expo(const int m, const unsigned int n) 
{   
    funcCallCounter++;  //counts how many times the function is called
    if (n == 0)//base case
    {
        return 1;
    }

    else if (n % 2 == 0)// for even numbers
        return expo(m*m, n / 2);
    else
        return m * expo(m, n - 1);//for odd numbers
}

這是我最喜歡的遞歸展覽方法,它總是會比你的方法提供更少的通話

int expo(int a, int n) {

    funcCallCounter++;
    if (n == 0) {
        return 1;
    }
    int r = expo(a, n / 2);
    if (n % 2 == 0) {
       //Even n
        return r * r;
    }
    else {
        // Odd n    
        return a *r*r;

    }
}

您可以使用班次來加快執行速度。

  • n % 2可以用n & 0x01替換
  • n / 2^k可以用n >> k代替

除法約為20個周期,而班次僅為1-2個周期。

但是,也許編譯器本身會看到taht並且已經進行了這種優化。

最好

暫無
暫無

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

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