阿克曼功能

dat*_*ili 4 java

我正在编写一个计算Ackermann函数的递归程序.

这是代码:

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));
    }
}
Run Code Online (Sandbox Code Playgroud)

但它告诉我错误:

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
Run Code Online (Sandbox Code Playgroud)

怎么解决这个问题?

dan*_*ben 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;
}
Run Code Online (Sandbox Code Playgroud)

更多的代码行不一定是坏的,代码高尔夫不一定好.编写代码,以便在一年内回复它,并能够轻松地弄清楚它的目的是什么.