【问题标题】:static variable in recursive function in cc中递归函数中的静态变量
【发布时间】:2018-06-21 16:37:30
【问题描述】:

我正在编写一个程序,该程序使用递归检查数字是否为回文。 我使用了一个静态变量来保持倒写的数字的值,最后我比较了它是否等于原始数字。

测试一个数字时它工作正常,但如果我尝试检查多个数字(我要求用户在主循环的 for 循环中输入几个数字),它检查第一个数字就好了,但其他数字它没有。

有没有办法在递归结束后(检查一个数字后)将静态变量重置回0?

bool IsPalindrome(unsigned int number) {
    static unsigned int Inverse = 0;
    unsigned int OriginalLastDigit, OriginalNumber=number;
    if (number != 0) {
        OriginalLastDigit = number % 10;
        Inverse = Inverse * 10 + OriginalLastDigit;
        IsPalindrome(number / 10);
    }
    if (OriginalNumber == Inverse) {
        return true;
    } else {
        return false;
    }
}

【问题讨论】:

  • 答案很简单——在递归中使用静态变量是“作弊”。而是将其作为附加参数传递,因此您的函数变得“纯”。
  • 顺便说一句,你不要使用递归调用的返回值。
  • 我会建议一种不同的方法 - 编写一个递归函数“ReverseNumber”,然后一个包装器比较n == ReverseNumber(n)。这种逻辑会更清晰。

标签: c recursion static palindrome


【解决方案1】:

将其结构化为

bool IsPalindrome(unsigned int number) {
  unsigned int Inverse = 0;
  return IsPalindromeHelper(number, &Inverse);
}

您的原始代码略有更改,因此签名是

bool IsPalindromeHelper(unsigned int number, unsigned int* Inverse)

可能是完成您想做的事情的最简单方法。知道何时重置静态变量是不可行的,除非传入一个标志......但如果你传入一个标志,那么就像其他人所指出的那样,只传入变量本身会更干净。

【讨论】:

  • 您忘记更改定义了。
  • 我也不确定......它实现了什么? Inverse 这里有什么用?更新:啊,好的,明白了。这是两个功能...
  • 原始代码似乎忽略了递归调用值,完全依赖 Inverse 处理递归状态。我没有费心去解开这段代码的实际逻辑,但这是在不使用静态变量的情况下复制相同行为的方法。
  • 是的,虽然它确实花了我一些试验和错误来让代码工作,因为我是新的指针。我在更改代码时犯的一个错误是我一直在新的辅助函数中调用原始函数
【解决方案2】:

您可以在number == 0 时重置它,但我不建议使用静态变量,因为它会导致诸如此类的问题,它不是线程安全的等等。

另一种方法是将其作为参数传递。

【讨论】:

  • 所以在第一个if 中添加else
  • 是的,这是停止递归的条件,所以此时可以重置变量。
  • 如果Inverse 是基于第一个if 重置的,那么第二个if 将不会执行所需的操作。
【解决方案3】:
bool IsPalindrome(unsigned int number, unsigned int Inverse)
{
    unsigned int OriginalLastDigit, OriginalNumber = number;
    if (number != 0)
    {
        OriginalLastDigit = number % 10;
        Inverse = Inverse * 10 + OriginalLastDigit;
        IsPalindrome(number / 10, Inverse);
    }
    if (OriginalNumber == Inverse)
    {
        return true;
    }
    else
    {
        return false;
    }
}

【讨论】:

  • 开始调用IsPalindrome 将不再有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-08
  • 2018-01-08
  • 2016-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多