我正在编写一个递归程序来计算 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
如何解决这个问题?
最佳答案
您的最后一个三元运算没有第三个操作数。
(m>0 && n>0)?阿克曼(m-1,阿克曼(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;
}
代码行数多不一定不好,code golf不一定好。编写您的代码,以便您可以在一年内回过头来看它,并且能够轻松弄清楚它的目的是什么。
关于java - 阿克曼函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2935680/