簡體   English   中英

遞歸函數中的全局變量如何將其保持為零?

[英]Global variable in a recursive function how to keep it at zero?

所以,如果我有一個帶有全局變量var_的遞歸函數:

int var_;

void foo()
{
  if(var_ == 3)
    return;
  else
    var_++; foo();
}

然后我有一個函數調用foo()所以:

void bar()
{
  foo();
  return;
}

什么是每次調用foo時設置var_ = 0的最佳方法,而不是來自內部。 我知道我可以這樣做:

void bar()
{
  var_ =0;
  foo();
  return;
}

但我正在使用遞歸函數,我不想調用foo而忘記在以后設置var_ = 0。

有沒有人對如何解決這個問題有任何建議?

謝謝,喬希

foo()轉換為輔助函數。

void foo() {
    var_ = 0;
    foo_helper();
}

void foo_helper() {
    if(var_ == 3)
        return;
    else
        var_++; foo_helper();
}

您不必更改任何現有代碼,您仍然可以調用foo()並讓它完成其工作。

我會將foo()拆分為初始化函數和真正的遞歸函數:

void foo()
{
    var_ = 0;
    foo_recur();
}

void foo_recur()
{
  if(var_ == 3)
    return;
  else
    var_++; foo_recur();
}

要添加到前兩個(非常相似)的答案,只需從類外部看到foo()方法,並將foo_helper()/ foo_recur()保持為私有(var_也應該是私有的)。 如果這是為了在多線程環境中使用,您還應該使foo()同步。

此外,最好將“var_”稱為實例或類變量(而不是“全局”)。

你真的需要這個全局變量嗎?

如果它僅用於控制遞歸的深度,則可以更優雅的方式重寫它,如下所示:

void foo()  {
    fooHelper(0);
}

void fooHelper(int var) {
    if (var == 3) return;
    else fooHelper(var + 1);
}

要讓函數知道它是否從內部調用,您可以添加一個參數:

int var_;

void foo(boolean from_itself)
{
 if(!from_itself)
  var_ = 0;
 if(var_ == 3)
  return;
 else
  var_++; foo(true);  // from within itself
}

void bar()
{
 foo(false);  // not from within itself
 return;
}

因此,這種方法不需要添加輔助函數。

暫無
暫無

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

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