c中递归函数中的静态变量
static variable in recursive function in c
我正在编写一个程序,使用递归检查数字是否为回文。
我使用一个静态变量来保持向后写入的数字的值,最后我比较它是否等于原始数字。
它在测试一个数字时工作正常,但如果我尝试检查多个数字(我要求用户在主要的 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;
}
}
您可以在 number == 0
时重置它,但我不建议使用静态变量,因为它会导致诸如此类的问题,它不是线程安全的,等等。
另一种方法是将其作为参数传递。
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;
}
}
将其构建为
bool IsPalindrome(unsigned int number) {
unsigned int Inverse = 0;
return IsPalindromeHelper(number, &Inverse);
}
您的原始代码略有更改,因此签名为
bool IsPalindromeHelper(unsigned int number, unsigned int* Inverse)
可能是完成您想做的事情的最简单方法。知道何时重置静态变量是不可行的,除了传递一个标志......但是如果你传递一个标志,就像其他人所指出的那样,只传递变量本身会更干净。
我正在编写一个程序,使用递归检查数字是否为回文。 我使用一个静态变量来保持向后写入的数字的值,最后我比较它是否等于原始数字。
它在测试一个数字时工作正常,但如果我尝试检查多个数字(我要求用户在主要的 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;
}
}
您可以在 number == 0
时重置它,但我不建议使用静态变量,因为它会导致诸如此类的问题,它不是线程安全的,等等。
另一种方法是将其作为参数传递。
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;
}
}
将其构建为
bool IsPalindrome(unsigned int number) {
unsigned int Inverse = 0;
return IsPalindromeHelper(number, &Inverse);
}
您的原始代码略有更改,因此签名为
bool IsPalindromeHelper(unsigned int number, unsigned int* Inverse)
可能是完成您想做的事情的最简单方法。知道何时重置静态变量是不可行的,除了传递一个标志......但是如果你传递一个标志,就像其他人所指出的那样,只传递变量本身会更干净。