我正在编写一个计算Ackermann function的递归程序。
以下是代码:
public class Ackermann{
public static long ackermann( long m,long n) {
return
(m==0)? n+1:
(m>0 && n==0)? ackermann(m-1,1):
(m>0 && n>0)? ackermann(m-1, ackermann(m,n-1));
}
public static void main(String[]args) {
long m=4;
long n=2;
System.out.println(ackermann(m,n));
}
}
但它显示了我的错误:
Ackermann.java:7: : expected
(m>0 && n>0)? ackermann(m-1, ackermann(m,n-1));
^
Ackermann.java:7: ';' expected
(m>0 && n>0)? ackermann(m-1, ackermann(m,n-1));
^
Ackermann.java:18: illegal start of expression
public static void main(String[]args){
^
Ackermann.java:18: ';' expected
public static void main(String[]args){
^
Ackermann.java:18: illegal start of expression
public static void main(String[]args){
^
Ackermann.java:18: ';' expected
public static void main(String[]args){
^
Ackermann.java:18: ';' expected
public static void main(String[]args){
^
Ackermann.java:26: reached end of file while parsing
}
^
8 errors
如何解决这个问题?
答案 0 :(得分:9)
您的上一次三元操作没有第三个操作数。
(m>0 && n>0)? ackermann(m-1, ackermann(m,n-1));
请注意?
但没有:
。
由于您已涵盖所有案例,因此您可以将其更改为返回-1,或抛出异常。
但是,如果不使用三元运算符,您也可以更可读地实现此函数:
public static long ackermann(long m, long n) {
if (m == 0) {
return n+1;
}
if (m > 0 && n == 0) {
return ackermann(m-1, 1);
}
if (m > 0 && n > 0) {
return ackermann(m-1, ackermann(m, n-1));
}
// Something went wrong
System.out.println("Invalid inputs: m and n cannot be negative");
return -1;
}
更多的代码行不一定是坏的,代码高尔夫不一定好。编写代码,以便在一年内回复它,并能够轻松弄清楚它的目的是什么。
答案 1 :(得分:4)
你的第三个三元如果没有第二个选择。修复之后构造本身可能是有效的,它很难看,而且更详细的检查会很容易地向你显示你做错了什么。重写你的if并意识到你不需要三个,第三个选项就是两个检查失败时剩下的选项。
计算Ackermann函数并不是真的有用,它会对大于3的所有m
进行爆炸。你的代码只会溢出而不会产生任何合理的结果。
答案 2 :(得分:4)
只需使用
public static long ackermann(long m, long n) {
return (m==0)?
n+1:
(m>0 && n==0)?
ackermann(m-1,1):
ackermann(m-1, ackermann(m,n-1));
}
你的最后一个三元运算符没用,甚至没有完成(缺少else
部分)。
答案 3 :(得分:2)
Java仅支持这种确切的语法conditional?true-statement:false-statement
那里没有像conditional?true-statement
这样的语法。
所以你应该修改你的代码:
public static long ackermann( long m,long n){
return
(m==0)? n+1:
(m>0 && n==0)? ackermann(m-1,1):
(m>0 && n>0)? ackermann(m-1, ackermann(m,n-1)):0;
}
答案 4 :(得分:1)
(m>0 && n>0)
为假