java - 阿克曼函数

标签 java

我正在编写一个递归程序来计算 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/

相关文章:

java - 无法更新数组内容

java - 提交响应后无法调用 sendRedirect()

java - 使用 AspectJ 扩展实体

java - jaxb 不生成具有基本整数的枚举

java - "getOutputStream() has already been called for this response"会导致服务器崩溃吗?

java - WindowBuilder 中的自定义组件

java - 是否有任何形式可以将字符数组放在字符串上并再次更改它?

java - GWT Cookies,在 rpc 期间设置时返回 null

java - 使用 Intent 发送和接收 Arraylist?安卓

java - 尝试在空对象引用上调用虚拟方法 'boolean java.lang.String.equals(java.lang.Object)'