我正在编写一个计算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));
    }
}

但它告诉我错误:

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

怎么解决这个问题?

#1楼 票数: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;
}

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

#2楼 票数:4

你的第三个三元如果没有第二个选择。 修复之后构造本身可能是有效的,它很难看,而且更详细的检查会很容易地向你显示你做错了什么。 重写你的if并意识到你不需要三个,第三个选项就是两个检查失败时剩下的选项。

计算Ackermann函数并不是真的有用,它会对大于3的所有m爆炸。你的代码只会溢出而不会产生任何合理的结果。

#3楼 票数: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部分)。

#4楼 票数:2

Java只支持这种确切的语法conditional?true-statement:false-statement没有类似conditional?true-statement语法conditional?true-statement out there。

所以你应该修改你的代码:

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; 
}

#5楼 票数:1

(m>0 && n>0)为假的情况没有表达式

  ask by dato datuashvili translate from so

未解决问题?本站智能推荐:

1回复

你如何让阿克曼函数“学习”?

我将如何让以下阿克曼函数“学习”并记住先前迭代的结果,以便它不会一遍又一遍地重新计算相同的东西? 例如:它应该知道,每当给它输入 (2,2) 时,它应该返回 7 而不需要再次运行计算。
3回复

标准的阿克曼可以优化吗?

用Java编写的标准Ackermann公式: 我一直在想-是否有更快的版本来实现? 我在想也许是通过使用累加器或循环。
2回复

哈夫曼树的HashMap

我有一个处理霍夫曼树的任务。 我的教授提到我们应该使用HashMap,但没有解释它们。 我已经了解了他们,但我在我的代码中遇到了问题。 这些是我得到的错误消息。 所以我可以说它希望它返回一个条目,但我不确定如何处理它。 我应该把它当作某种东西吗? 这是我的代码。
1回复

贝尔曼福特表演

我已经从(LinkedList)列表中实现了Bellman ford,因为该算法运行了V-1(循环1)次并进入每个顶点(在Loop2中),它检查了所有边缘(在loop3中)并更新了目的地的距离。 “M这里混淆了时间复杂度仍然是O(VE)或改变,我已经看到了这工作2个循环中完成这就是为什么,并且也
1回复

如何调用ParkingTicket(帕克,帕克)?

这是我的问题,如果(carMinutesPaid> meterMinutesPaid),我似乎无法弄清楚如何调用ParkingTicket对象? 有人可以帮忙吗?下面是问题的详细信息。 这是我的项目的问题。 请记住,该方法必须能够在不存在ParkingTicket对象的情况下使用
1回复

艾尔曼网络不停

我对XOR运算符的Elman网络培训没有停止,它经历了数百万次迭代。 任何帮助将非常感激!
2回复

莱曼素性测试[关闭]

我正在做雷曼测试,而以下功能并没有给出100%准确的输出。 它表示所有p为素数。 我一直在搜索,算法似乎是正确的。 请问可能是什么问题? } 修改后的代码
3回复

Elasticsearch和卢克

如何用luke打开弹性搜索索引? 我尝试从3.5到4.8,使用elasticsearch 1.1到1.2,似乎没有任何工作。 似乎唯一适用的资源是http://rosssimpson.com/blog/2014/05/06/using-luke-with-elasticsearch/ ,