【发布时间】:2019-06-12 00:02:58
【问题描述】:
我有一个带有值的字符串数组
patrick
portland
vic
我想实现以下目标:
对于第一遍,我希望在每个条目的末尾附加一个带有 * 的数组:
patrick*
portland*
vic*
第二遍,我想用 ~ 代替 *:
patrick*
portland*
vic~
patrick*
portland~
vic*
patrick~
portland*
vic*
对于第三遍,我想用 ~ 替换另一个 *:
patrick~
portland*
vic~
patrick~
portland~
vic*
patrick*
portland~
vic~
以此类推,直到所有 * 都被 ~ 替换。
有没有办法不用递归?
编辑 1:
需要根据以下字符串生成:patrick portland vic
patrick*portland*vic*
patrick*portland*vic~
patrick*portland~vic*
patrick~portland*vic*
patrick~portland*vic~
patrick~portland~vic*
patrick*portland~vic~
patrick~portland~vic~
我认为将字符串拆分为数组然后继续工作会更容易。
编辑 2:
设法使用笛卡尔积解决了这个问题。
string[] stnameSplit = streetName.Split(' ');
string[] chars = { "*", "~" };
var cartesianProduct = from name in stnameSplit
from cha in chars
select new { name, cha };
List<string> vals = cartesianProduct.Select(p => p.name + p.cha).ToList();
List<List<string>> embeddedList = new List<List<string>>();
int ctr = 0;
List<string> l = new List<string>();
foreach (string s in vals)
{
l.Add(s);
if (ctr % 2 == 1)
{
embeddedList.Add(l);
l = new List<string>();
}
ctr++;
}
var result = embeddedList.ToArray().CartesianProduct();
最后一行调用 Eric Lippert 所描述的 CartesianProduct 方法。
感谢大家的帮助和指引我正确的方向。
【问题讨论】:
-
我不明白为什么你需要多次传递,或者传递 2 和 3 是如何工作的,这至少可以说是令人困惑的
-
总有一种方法可以不用递归;递归只是编写循环的一种奇特方式。您有更具体的问题吗?
-
你能告诉我们一个递归算法来解决你的问题吗?如果你的问题是“我有一个递归算法,我需要让它迭代,我该怎么做?”,我们当然可以给你一些策略。但这个问题需要说得更清楚。
-
另外,如果您能说出为什么要避免递归解决方案,那将有所帮助。通常对于这类问题,递归解决方案简短、易于理解且优雅,而迭代解决方案则是一团糟。为什么要避免使用简短、优雅、易于理解的解决方案?
-
好的,我已投票重新提出问题