簡體   English   中英

用C ++編寫遞歸函數的最佳方法?

[英]Best way to write a recursive function in C++?


我想知道這是否是實現可變深度遞歸的可行方法,這樣我就可以在每個步驟以及描述問題的任何更好/其他解決方案上運行一個函數。
描述
假設我希望有一個函數可以用模式填充數組
x,y,x,y,x,y其中x和y是某些算法定義的變量
x,y,z,x,y,z ,其中x,y和z是由同一算法定義的變量。

對於所有數量的變量,此操作應繼續。 這是實現它的可行方法嗎?

void recurse_n(int n)
{
    while(n > 0)
    {
        --n;
        recurse_n(n);
        n = 0;
        // Use algorithm here
    }
}

編輯:刪除了以前引用的不正確的返回類型。 Brainfart。

因此,根據您的評論,您想了解設置遞歸函數的最佳方法。 您所做的工作會奏效,但是令人費解,有些混亂。 我要做的就是簡化它:

void recurse_n(int n) {
    if (n <= 0) {
        // Break-out condition
        return;
    }

    --n;
    recurse_n(n);

    // Your algorithm stuff here.
}

這樣可以更輕松地了解發生了什么。 我要補充的一件事是,您可能想在調用recurse_n之前先做算法工作,但這一切都取決於您算法的工作。

如果以我寫的方式考慮,它將遞歸直到n小於或等於0,然后再執行任何算法工作。 可能是您想先執行算法然后遞歸。

首先,使用std :: vector和循環(我假設x(),y()和z()返回所需的int ,也可以在其中使用向量存儲值):

void fill( std::vector<int> &vec, std::vector<int> &values )
{
    size_t nValues = values.size();
    size_t sz = vec.size();
    for( size_t i=0; i<sz; i=i+nValues )
    {
        for( size_t j=0; j<nValues; ++j )
        {
            vec[i] = values[j];
        }
    }
}

int main()
{
    std::vector<int> vec;
    std::vector<int> values;
    /* fill values vector here */
    vec.resize( 512 ); // (arbitraty) size you need
    fill( vec, values );

    return 0;
}

與遞歸函數相比,這更像C ++,並且速度更快。 另外:存儲x,y和z值,以便相應的算法僅執行一次。

我認為這不是可行的方法,因為:讓T(n)表示函數的運行時間(取決於輸入參數n )。

基本情況n=0產生以下運行時間: T(0)=c ,即一些恆定的運行時間c

現在,您可以為運行時間定義一個遞歸公式,其中n>0T(n)=sum(i = 0 to n-1: T(i))

如果求解此方程,則將得到T(n)=O(2^n) ,這意味着您的算法是指數算法,這意味着它在實踐中不易處理。

我對這個問題還不太清楚,但是聽起來您有一組變量a, b, c, ..., z並且您想填充一個數組,使其包含a, b, c, ..., z, a, b, c, ..., z, a, ... 如果是這樣,將源變量放入其自己的一遍數組a, b, c, ..., z並將其memcpy放入目標數組,直到填充memcpy ,這可能是最簡單的

#define NUM 3
int a, b, c; // source variables
void fill(int* arr, unsigned int size) {
    int src[] = {a, b, c};
    unsigned int i;
    for(i = 0; i < size / NUM; i++)
        memcpy(arr + (NUM * i), src, sizeof(int) * NUM);
    memcpy(arr + (NUM * i), src, sizeof(int) * (size % NUM));
}

JimDaniel是正確的,這里的遞歸是一個過大的殺傷力。 您沒有從該函數返回任何內容,並且看起來您僅在使用“ n”來控制遞歸次數。 使用簡單的for循環會更清晰+更有效率。

如果您的算法滿足以下要求,則遞歸填充數組是有效的(甚至是最好的)選項:

  1. 位置n上的值取決於它之前至少有一些值
  2. 在沒有首先確定它所依賴的較早值的情況下,沒有(已知)方法可以確定位置n的值。

滿足這些要求的一個例子是斐波契數 因為您必須先確定所有較早的數字才能確定第n個數字(盡管存在一些快捷方式)。

一個不滿足這些要求的示例是一個用索引的平方填充的數組,其中位置n處的值僅為n^2

最后,如果可能的話,我建議您根據DaveJohnston對問題的回答中的模式重寫函數。

暫無
暫無

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

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