【问题标题】:Problem with Java function using tree recursion使用树递归的Java函数问题
【发布时间】:2020-06-02 11:18:08
【问题描述】:

我在将代码从 Racket 转换为 Java 时遇到问题。

我在 Racket 中编写了一个程序,用于解决“曼哈顿街道”问题的 3D 版本。

问题在于,在 Racket 中,创建树类型递归来解决问题非常容易,而在 Java 中,我遇到了一些问题。 我了解到我应该在 Java 中使用 Nodes 进行树递归,但我不知道它们是如何工作的。 有什么提示吗?

这是我需要用 Java 翻译的原始 Racket 代码:

(define (manhattan-3d i j k)
    (cond
      [(and (= i 0) (= j 0)) 1]
      [(and (= i 0) (= k 0)) 1]
      [(and (= j 0) (= k 0)) 1]
      [(or (= i -1) (= j -1) (= k -1)) 0]
      [(or (and (> i 0) (> j 0)) (and (> i 0) (> k 0)) (and (> j 0) (> k 0))) (+ (manhattan-3d (- i 1) j k) (manhattan-3d i (- j 1) k) (manhattan-3d i j (- k 1)))]
     )
  )

如您所见,在 Racket 中这是一个非常简单和简短的过程,但我不知道如何在 Java 中解决它。

感谢任何形式的帮助!

【问题讨论】:

  • 出于好奇,您是否尝试过直接翻译它,只使用ints?因为我在这段代码中看不到任何不能直接翻译成Java的东西。在 Java 中使用递归的主要风险是它不执行尾部调用消除,但在这种情况下似乎也不会。

标签: java function recursion tree racket


【解决方案1】:

我在这段代码中没有看到任何树。

虽然我不知道球拍,但代码似乎可以理解。

看起来你只需要几个条件:

public static int manhattan3d (int i, int j, int k) 
{
    if (i == 0 && j == 0)
        return 1;
    else if (i == 0 && k == 0)
        return 1;
    else if (j == 0 && k == 0)
        return 1;
    else if (i == -1 || j == -1 || k == -1)
        return 0;
    else
        return manhattan3d (i - 1, j, k) + manhattan3d (i, j - 1, k) + manhattan3d (i, j k - 1);
}

【讨论】:

  • 我找到了类似的解决方案……但您的解决方案确实有效。谢谢!
【解决方案2】:

你应该在java中使用节点来创建一棵树。

Java 中的 Node 类是一个类,它至少包含一个名称和一个称为 children 的节点列表。

这里节点 1 有 2 和 3 作为其子节点。

节点 2 有 4 和 5 作为其子节点,...

树的每个节点都是类节点的一个实例。要转到一个节点,您必须使用递归方法。

【讨论】:

  • "你应该在 java 中使用节点。"为什么?
  • 不在这里对不起,我编辑来解决这个问题,但我认为提问者想知道如何创建一棵树。
猜你喜欢
  • 2018-12-16
  • 2017-04-09
  • 1970-01-01
  • 1970-01-01
  • 2016-09-19
  • 2015-01-27
  • 1970-01-01
  • 2017-03-13
  • 2011-07-24
相关资源
最近更新 更多