【发布时间】:2020-05-27 21:50:08
【问题描述】:
我有一个非常简单的 java 类来解决使用递归方法的解码方式。我看到了条件运算符的这种奇怪行为,
package decodeways;
public class Solution {
public static void main(String[] args) {
System.out.println(numDecodings("1456"));
}
public static int numDecodings(String s) {
if(s.length()>0 && s.charAt(0)=='0')
return 0;
if(s.length()==0) return 1;
if(s.length()==1)
return 1;
int num1 = s.charAt(0)-'0';
int num2 = s.charAt(1)-'0';
int one = numDecodings(s.substring(1));
int two = s.length()>1?numDecodings(s.substring(2)):0;
int res = one
+ num1<3 && num2<7 ? two:0;
return res;
}
}
如果我加上括号,(num1<3 && num2<7 ? two:0) 那么一切都很好,但如果我删除括号,则会得到不正确的结果。
在调试过程中,one会被计算为1,2会被计算为1,res也会被计算为1带括号但不带括号, res 的计算结果将为 0(附有截图),这是错误的来源。 我知道 java 中的运算符优先级,但在这种情况下,我无法弄清楚为什么它显示不正确的行为,因为在下面的代码中:
int res = one
+ num1<3 && num2<7 ? two:0;
one + num1num1<3 && num2<7 ? two:0 视为原子操作(如果我错了,请纠正我),无论括号是否可用。
请指导我更好地理解。
谢谢。
【问题讨论】:
-
conditional-operator 的行为与recursive-datastructures 没有任何关系。准确而不是乱加标签。请勿在此处发布文字图片。
-
@user207421 我不是发文字图片,只是想展示调试器的例程。我知道条件运算符不必对解决方案的递归方法做任何事情,只是想告诉这个问题的观众这个问题涉及递归理解。我看不出有任何错误或恶意。
-
@user 和recursion 也没有任何关系。 OP 的代码可能与递归有关,但运算符与递归无关。
-
@pkm 您发布了您的程序的图片。您的程序是文本。直接发文。制作图片和发布完全是浪费您的时间和我们的带宽。