gpt4 book ai didi

java - 使用递归重新排序参数(赞成,反对,替代方案)

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:04:07 27 4
gpt4 key购买 nike

我发现我经常进行递归调用只是为了重新排列参数。

例如,这是我对 endOther from codingbat.com 的解决方案:

Given two strings, return true if either of the strings appears at the very end of the other string, ignoring upper/lower case differences (in other words, the computation should not be "case sensitive"). Note: str.toLowerCase() returns the lowercase version of a string.

public boolean endOther(String a, String b) {
return a.length() < b.length() ? endOther(b, a)
: a.toLowerCase().endsWith(b.toLowerCase());
}

我对递归非常满意,但我当然可以理解为什么有些人可能会反对它。

对于这种递归技术,有两种明显的替代方法:

传统上交换ab

public boolean endOther(String a, String b) {
if (a.length() < b.length()) {
String t = a;
a = b;
b = t;
}
return a.toLowerCase().endsWith(b.toLowerCase());
}
  • 在像 Java 这样不通过引用传递的语言中不方便
  • 很多代码只是为了做一个简单的操作
  • 一个额外的if语句打破了“流程”

重复代码

public boolean endOther(String a, String b) {
return (a.length() < b.length())
? b.toLowerCase().endsWith(a.toLowerCase())
: a.toLowerCase().endsWith(b.toLowerCase());
}
  • 显式对称可能是一件好事(或者不是?)
  • 除非重复的代码非常简单,否则这是个坏主意
    • ...虽然在这种情况下你可以摆脱三元和只是||这两个表达式

所以我的问题是:

  • 这 3 种技术有名称吗? (还有更多吗?)
    • 他们取得的成就有名字吗? (例如“参数规范化”,也许?)
  • 是否有关于(何时)使用哪种技术的官方建议?
  • 还有哪些我可能忽略的优点/缺点?

另一个例子

为了将讨论更多地集中在技术而不是特定的 codingbat 问题上,这是另一个我认为递归比一堆 if-else、交换或重复代码优雅得多的示例。

// sorts 3 values and return as array
static int[] sort3(int a, int b, int c) {
return
(a > b) ? sort3(b, a, c) :
(b > c) ? sort3(a, c, b) :
new int[] { a, b, c };
}

递归和三元运算符并不像某些人那样困扰我;老实说,我相信上面的代码是最好的纯 Java 解决方案。请随时告诉我其他情况。

最佳答案

让我们首先确定代码重复通常不是一个好主意。

因此无论我们采取什么解决方案,该方法的逻辑都应该只写一次,我们需要一种在不干扰逻辑的情况下交换参数的方法。

我看到了三个通用的解决方案:

  1. 您的第一个递归(使用 if 或条件运算符)。
  2. swap – 这在 Java 中是个问题,但在其他语言中可能适用。
  3. 两个独立的方法(如@Ha 的解决方案),其中一个作为逻辑的实现,另一个作为接口(interface),在本例中用于整理参数。

我不知道这些解决方案中哪一个是客观上最好的。但是,我注意到有些算法通常将 (1) 作为惯用的解决方案,例如Euklid算法计算两个数的GCD。

我通常不喜欢 swap 解决方案 (2),因为它添加了一个额外的调用,实际上并没有做任何与算法相关的事情。现在,技术上这不是问题 - 我怀疑使用任何像样的编译器它的效率都不会低于 (1) 或 (3)。但它增加了心理减速带。

解决方案 (3) 给我的印象是过度设计,尽管我想不出任何批评,除了它需要阅读更多文本。一般来说,我不喜欢任何以“Impl”为后缀的方法引入的额外间接。

总而言之,在大多数情况下我可能更喜欢 (1),尽管我实际上在类似情况下使用了 (3)。

关于java - 使用递归重新排序参数(赞成,反对,替代方案),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2573933/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com