函数返回false,即使if语句为真

本文关键字:语句 if 即使 返回 false 函数 | 更新日期: 2023-09-27 17:50:45

问题在这里:https://leetcode.com/problems/happy-number/

我的解决方案:

static int count = 0; 
public static void Main(string[] args)
{
    Console.WriteLine(happyNumber(19));
    Console.ReadLine(); 
}
public static bool happyNumber(int  a)
{
    double result = 0;
    Stack<int> stapel = new Stack<int>(); 
    //Split the integer into single digits and save them in a stack
    while (a.ToString().Count() > 1)
    {
        stapel.Push(a % 10);
        a = a / 10;
    }
    if (a.ToString().Count() == 1)
    {
        stapel.Push(a);
    }
    // Add the square of the digits to get the result
    foreach (var item in stapel)
    {
        result += Math.Pow((double)item, 2);
    }
    // Check if it's a happy number
    if(result == 1.0)
    {
        return true;
    }
    // counter to stop if it is a endless loop
    else if(count < 100)
    {
        count++;
        happyNumber((int)result);
    }
    return false;
}

所以输入19是一个满意数,并且if子句在第四次运行时为真。您可以在if(result == 1.0)设置一个断点来检查它。那么为什么我的函数返回false呢?

函数返回false,即使if语句为真

不必要地强制转换为双精度类型。制作resultint,而不是double(或者如果你担心int的结果太大,就制作long)。将对Math.Pow的调用替换为手动化item,如下所示:

result += item * item;

控制流没有进入if(result == 1.0)块的原因是由于内部表示浮点值的方式。测试double s之间的相等性是有问题的,因此(在这种情况下)您可能应该完全避免使用它们,因为它们是不需要的。

这里还有一个递归调用:

happyNumber((int)result);
但是,该调用什么也不做,因为您实际上没有对返回值做任何事情。考虑将这一行替换为:
return happyNumber((int)result);

这将返回递归调用的值,而不是丢弃它。

你的函数是递归的,但是你没有对递归调用的结果做任何事情。

happyNumber((int)result);

:

return happyNumber((int)result);

那么19的结果是true。浮点数的比较可能还有其他问题,但这可能是您的主要问题!

这是因为你的happyNumber方法调用自己(最后第三行),然后从这个调用它击中return true行-但这只返回一个步骤堆栈到happyNumber方法....然后到达return false