2017-02-12 60 views
0

该提示要求我在下面使用公共静态并仅使用递归。这是我第一周使用Java,所以我的知识基础很低。我看到一些Luhn算法的在线代码,但似乎没有一个使用布尔作为第二个参数。Java新手,无法制作Luhn算法

基本上我需要创建一个Luhn算法,它从每个值(从右到左),将第二个值加倍(布尔值用于确定数字是否加倍),然后将所有值一起。例如, )。 System.out.println(sumLuhnDigits(7992739871005L,false));

会返回72

我遇到的问题是'长'型。

Java告诉我,我需要在设置它等于(数字%10)之前启动count变量。等等。我假设这是因为我已将它设置为+ =并且它需要具有值才能执行所以。然而,在顶部设置它等于0,与我试图制作的计数器混淆。

语法也不喜欢当我尝试返回计数,说它不是'长'型。 看来我目前还陷入了一个stackoverflow错误。所以我需要摆脱递归。

public static long sumLuhnDigits(long number, boolean odd) { 
    /// Java IDE said I needed to initiate the variable count but now it won't accumulate properly being set = 0 
    long count = 0; 

    if (odd == false) { 

     count += number % 10; 
     number = number/10; 

     odd = true; 
     return sumLuhnDigits(number, odd); 

    } if (odd == true) { 
     count += (number % 10) * 2; 
     number = number/10; 
     odd = false; 
     return sumLuhnDigits(number, odd); 

     /// Here I ran into the problem that count is not the type long, this is also as far as I have gotten  
    } if (number == 0) { 
     return count; 
    } 
} 
+0

欢迎堆栈溢出!看起来你可能是一个寻求作业帮助。虽然我们本身没有任何问题,但请观察这些[应做和不应该](http://meta.stackoverflow.com/questions/334822/how-do-i-ask-and-answer-homework-questions/338845#338845),并相应地编辑您的问题。 (即使这不是作业,请考虑建议。) –

+1

你忘了问一个问题。究竟发生了什么问题? –

+1

最后一个'else if'块怎么能评估?布尔“odd”不得不是假的,也不是真的。这绝不会发生。 –

回答

3
  1. 伯爵绝对是一个漫长的类型

  2. 因为你递归和重置一个局部变量你没有积累任何东西。

你可以尝试两种方法来传递计数(还有其他方法可以做同样的事情)。另外,我怀疑卡号会加起来超过一个整数的最大值。

public static int sumLuhnDigits(long number, boolean odd) { 
    return sumLuhnDigits(number, odd, 0); 
} 

private static int sumLuhnDigits(long number, boolean odd, int count) { 
    if (number <= 0) return count; 
    if (!odd) { 
     count += number % 10; 
    } else { 
     count += (number % 10) * 2; 
    } 
    number = number/10; 
    odd = !odd; 
    return sumLuhnDigits(number, odd, count); 
} 
+0

我会看看你的方法。谢谢!我确实注意到它在我的帖子中给出了对该例子的回应90,但我需要更多地了解代码才能更好地理解它。 – JWA

+0

你的算法可能只是错误的;)这里的解决方案是丰富的http://rosettacode.org/wiki/Luhn_test_of_credit_card_numbers#Java –

+1

我看到我的错误,我需要将两位数值加在一起。再次感谢。 – JWA

2

以下不一定是正确答案,但涉及一些代码决定。 来计算什么。所以:多功能编码。

public static long sumLuhnDigits(long number, boolean odd) { 
    if (number == 0) { 
     return 0; 
    } 

    long count; 
    if (!odd) { 
     count = number % 10; 
    } else { 
     count = (number % 10) * 2; 
    } 
    return sumLuhnDigits(number/10, !odd) + count; 
} 
  • 的最终条件(达到0号可以做到第一。
  • count是一个局部变量,因为它甚至不是一个参数,它不累积什么。
  • ,但你可以它添加到结果。
  • 布尔是没有== false/true更好的利用。
+0

谢谢!我对这种语言还很陌生,这对我有很大的帮助。 – JWA