[英]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>0
: T(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循環會更清晰+更有效率。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.