我正在尝试输入字符串的排列 例如字符串“123”应该给我 123 132 213 231 321 312 我需要帮助来修复我的代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TestAAD
{
class Program
{
static int len = 0;
static int lenPerm = 0;
private static void Permutations(string str, string perm , int i)
{
if (i == len) Console.WriteLine(perm);
for (int k = 0; k < len; k++)
{
lenPerm = perm.Length;
for (int j = 0; j < lenPerm; j++)
{
if ((perm[j] == str[(len - 1) - k]) && (len-1-k>0))
k++;
}
if((len-1-k) >=0)
Permutations(str, perm + str[(len - 1) - k], i++);
}
}
static void Main(string[] args)
{
string st = "123";
len = st.Length;
Permutations(st, "",0);
}
}
}
如果有人可以帮助我,请 谢谢所有
答案 0 :(得分:1)
Permutations
在Permutations
次循环中再次调用len
。第二次Permutations
次呼叫会在Permutations
次循环中再次呼叫len
。这种情况一次又一次地发生,或者至少在堆栈溢出之前发生。
当您使用递归调用时,您始终必须确保递归停止在某处。
If (job not done) {
make recursive call
}
递归调用必须向完成作业迈出一步,否则它永远不会完成。
更新1 (仅解决异常问题)
该方法难以阅读。而不是多次重复表达len-1-k
,反转循环! for (int k = str.Length - 1; k >= 0; k--)
并在内部循环中使用k
减少k--
。我也摆脱了变量len
,这是多余的。
在您的实施中,len-1-k
始终为>= 0
。因此递归调用永远不会结束。因此我改变了减少k
的条件。即使已经k
,它也会减少0
。为了不在str[k]
中获取索引越界错误,必须首先检查条件k >= 0
。
private static void Permutations(string str, string perm, int i)
{
if (i == str.Length)
Console.WriteLine(perm);
for (int k = str.Length - 1; k >= 0; k--) {
int lenPerm = perm.Length;
for (int j = 0; j < lenPerm; j++) {
if (k >= 0 && perm[j] == str[k])
k--;
}
if (k >= 0)
Permutations(str, perm + str[k], i++);
}
}
public static void Start()
{
string st = "123";
Permutations(st, "", 0);
}
这不再产生无限递归,但结果仍然不正确。我让你弄清楚如何进一步改进代码。
更新2 (创建正确的排列)
最后,这是我的工作实施
public static class PermutationBuilder
{
private static char[] _characters;
private static List<string> _list;
public static IEnumerable<string> GetPermutations(string characters)
{
_characters = characters.ToCharArray();
_list = new List<string>();
AddPermutations("", 0);
return _list;
}
private static void AddPermutations(string permutation, int level)
{
if (level >= _characters.Length) {
_list.Add(permutation);
} else {
for (int i = 0; i < _characters.Length; i++) {
char ch = _characters[i];
if (ch != ' ') {
_characters[i] = ' ';
AddPermutations(permutation + ch, level + 1);
_characters[i] = ch;
}
}
}
}
}
请注意,我会暂时标记与空格字符一起使用的字符。
你这样称呼它
foreach (string permutation in PermutationBuilder.GetPermutations("123")) {
Console.WriteLine(permutation);
}
答案 1 :(得分:1)
排列非常容易。
public string[] FindPermutations(string word)
{
if (word.Length == 2)
{
char[] c = word.ToCharArray();
string s = new string(new[] { c[1], c[0] });
return new[]
{
word,
s
};
}
List<string> result = new List<string>();
string[] subsetPermutations = FindPermutations(word.Substring(1));
char firstChar = word[0];
foreach (string temp in subsetPermutations
.Select(s => firstChar.ToString(CultureInfo.InvariantCulture) + s))
{
result.Add(temp);
char[] chars = temp.ToCharArray();
for (int i = 0; i < temp.Length - 1; i++)
{
char t = chars[i];
chars[i] = chars[i + 1];
chars[i + 1] = t;
string s2 = new string(chars);
result.Add(s2);
}
}
return result.ToArray();
}