【问题标题】:What is the better approach for recursive function returning boolean values [closed]递归函数返回布尔值的更好方法是什么[关闭]
【发布时间】:2021-09-06 15:45:14
【问题描述】:

我正在练习链表问题:在 Java 中使用递归搜索元素,只是想知道哪种方法更好?

答:

protected boolean searchElement(Node current, int element){
    boolean res = false;
    if(current != null){
        if(current.getData() == elem) res = true;
        else function(current.getNext(),elem);
    }
    else res = false;
    return res;
}

乙:

protected boolean searchElement(Node current, int elem){
  if(current != null){
    if(current.getData() == elem) return true;
    else search(current.getNext(), elem);
  }
  return false;
}

【问题讨论】:

  • 你能解释一下你想从这段代码中获得什么输出吗?

标签: java recursion linked-list


【解决方案1】:

我更喜欢先处理特殊情况,然后再处理递归(在可行的情况下)。 这是具有多个返回的代码样式 - 许多人没有找到好的样式。 但它可以防止嵌套条件等。

protected boolean searchElement(Node current, int element) {
    if (current == null) {
        return false;
    }
    if (current.getData() == elem) {
        return true;
    }
    return search(current.getNext(), elem);
}
  1. 案例:空节点上的终止条件。
  2. 案例:找到。
  3. 递归,最后是所谓的尾递归

尾递归可以很容易地转化为迭代。

protected boolean searchElement(Node current, int element) {
    while (current != null) {
        if (current.getData() == elem) {
            return true;
        }
        current = current.getNext();
    }
    return false;
}

【讨论】:

  • 您在第一个示例中犯了一个错误。它必须是 'if (current == null) { return false; }'
  • 稍作修改
【解决方案2】:

除非有特定的 Java-hackish 字节码注入优化原因在递归函数中使用 end-recursion/tail-call 策略,否则我什至会这样做(fail-fast-fail-early):

protected boolean function(arguments){
  if(!condition_1) return false;
  if(condition_2) return true;
  return function(arguments);
}

顺便说一句,您的伪代码中可能有错误: 在 A 和 B 中,处理

else function(arguments);

看起来无关紧要。它将运行该函数,但无论function() 做什么(除非它抛出未捕获的异常/可抛出),两种实现都将返回false。这表明要么

  • 编程错误,
  • 或一些副作用(更改外部状态变量,如静态或成员变量),而递归函数不应该这样做

如果这只是编程/设计中的错误,我建议您始终将伪代码转换为真实代码。这样编译器通常会告诉你这样的事情,让它们更明显。放大您的干净代码/代码异味警告设置。

哦,还有一个要考虑的注意事项:您始终可以用循环和一些变量/列表替换递归函数,这通常会大大提高速度(运行时不会创建和释放堆栈帧)但通常会降低可读性(多个变量搞砸了,而不是干净地分配参数)。 对于您的示例,由于对 function() 的调用的影响尚不清楚,因此我无法在此为您提供一个有意义的示例。

【讨论】:

  • 感谢您的信息
猜你喜欢
  • 1970-01-01
  • 2015-04-12
  • 1970-01-01
  • 2015-02-08
  • 2015-12-27
  • 1970-01-01
  • 2021-01-06
  • 1970-01-01
  • 2020-07-25
相关资源
最近更新 更多