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

时间:2015-05-25 17:46:26

标签: c# if-statement

问题在于: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呢?

3 个答案:

答案 0 :(得分:2)

您的函数是递归的,但您不会对递归调用的结果做任何事情。

如果你改变:

happyNumber((int)result);

要:

return happyNumber((int)result);

然后你19的结果是true。浮点数的比较可能存在其他问题,但这可能是您的主要问题!

答案 1 :(得分:2)

你不必要地投入一双。将result设为int而不是double(如果您担心结果对于long来说太大,请设为int )。将呼叫替换为Math.Pow,并手动平方item,如下所示:

result += item * item;

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

您还可以在此处进行递归调用:

happyNumber((int)result);

但是,该调用不执行任何操作,因为您实际上并未对返回值执行任何操作。考虑用以下代码替换该行:

return happyNumber((int)result);

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

答案 2 :(得分:0)

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