-1

我必须检查一个数字是否是回文或不使用递归..我正在使用以下函数但我很困惑,因为每当我使用while 循环代替if语句时,都会生成无限循环!

为什么while循环不能正常工作?

我的代码是:

#include<stdio.h>
int Check_Pal(int);
int main()
{
    int i,sum,n;
    printf("enter no");
    scanf("%d",&n);
    sum=Check_Pal(n);
    if(sum==n)
    {
        printf("palindrome");
    }
    else
    {
        printf("not a palindrome");
    }
    return 0;
}
int Check_Pal(int k)
{
    int r;
    static int sum=0;
    while(k!=0)//if i use an if its fine but while loop does not work 
    {
        r=k%10;
        sum = sum*10+r;
        Check_Pal(k/10);    
    }
    return sum;
}
4

4 回答 4

2

您不需要while在代码中使用循环,因为对函数的递归调用会Check_Pal()产生 while 循环的效果。

考虑下面给出的代码,

while(k!=0)
{
    r=k%10;
    sum = sum*10+r;
    Check_Pal(k/10);    
    ^
    |__ Here you are discarding the value returned by "int Check_Pal()"
}

此外,为了获得正确的结果,最好将变量声明sum为全局变量。

试试这样的,

int sum=0;

void Check_Pal(int k)
{
    int r;
    if(k!=0)
    {
        r=k%10;
        sum = sum*10+r;
        Check_Pal(k/10);    
    }
}

int main()
{
  int n;
  printf("enter no");
  scanf("%d",&n);
  Check_Pal(n);
  if(sum==n)
  {
      printf("\npalindrome");
  }
  else
  {
      printf("\nnot a palindrome");
  }
  return 0;
}
于 2013-05-26T05:20:59.773 回答
1

请参阅,在您的代码中 k 不会更改,当您这样做时,Check_Pal(k/10)只会将k/10值分配给k递归调用,但不会分配给当前的局部变量k。但是,您甚至不需要在这里使用 while 循环。因此,当您给出一个正的非零值表达式时,while总是在非零的第一级递归上计算为真k,因此会发生无限循环。所以,k在第一次调用中永远不会为零......如果给出非零输入

int Check_Pal(int k)
{
    int r;
    static int sum=0;
    while(k!=0)//this always evaluates to true on first level of recursion with non-zero k 
    {
        r=k%10;
        sum = sum*10+r;
        Check_Pal(k/10);//value is assigned to k in recursive call not to the current k
    }
    return sum;
}

祝一切顺利...

于 2013-05-26T05:32:20.550 回答
1

这是一个使用递归但不需要全局变量的解决方案

bool checkpal(int k) {
    int r = k % 10, power_of_10=1;
    while (10 * power_of_10 < k) power_of_10 *= 10;
    if (k / power_of_10 != r) return false;
    if (power_of_10 == 1) return true;
    int next_k = (k - r * power_of_10) / 10;
    return (power_of_10 == 1000 && next_k < 11 ? next_k == 0 : checkpal(next_k));
}

更新:刚刚意识到这是不完美的。最后一行中的测试power_of_10 == 1000 && next_k < 11只处理一种情况,即删除最高有效数字会导致 next_k 带有前导零。毫无疑问,这可以解决,但现在我没有时间。

于 2013-05-26T05:56:55.490 回答
0

在“while”循环中,您没有更改 k,语句“k!= 0”始终为真。因此,您将无限循环。

于 2013-05-26T05:37:09.873 回答