我在PowerShell中编写了以下代码来显示给定字符串的排列和组合,但我无法通过递归函数实现它。
function Swapping1 {
$a = "abc"
$b = $a.ToCharArray()
$c = $b.Length-1
$d = 0
GetPer($b, $d, $c)
}
function GetPer {
Param($list, $k, $m)
[char[]] $list1 = $list[0]
$k = $list[1]
$m = $list[2]
if ($k -eq $m) {
# Write-Host $list1
} else {
for ($i = $k; $i -le 1; $i++) {
$a = $list1[$k]
$b = $list1[$i]
$a, $b = $b, $a
$k = $k+1
Write-Host $list[0]
GetPer($list[0], $k, $m)
$a, $b = $b, $a
}
}
}
当我在C#中编写它时,它的工作正常。
private static void Swap(ref char a, ref char b) {
if (a == b) return;
a ^= b;
b ^= a;
a ^= b;
}
private static void GetPermutation(char[] list, int k, int m) {
if (k == m) {
Console.Write(list);
Console.WriteLine();
} else
for (int i = k; i <= m; i++) {
Swap(ref list[k], ref list[i]);
GetPermutation(list, k + 1, m);
Swap(ref list[k], ref list[i]);
}
}
static void Main(string[] args) {
string str = "abc";
char[] arr = str.ToCharArray();
int x = arr.Length - 1;
GetPermutation(arr, 0, x);
//GetPer(arr);
Console.Read();
}
以下是我执行PowerShell脚本时的输出:
PS C:\WINDOWS\system32> C:\Dorababu\Power Shell\Swapping1.ps1
a b c
a b c
a b c
C#输出:
答案 0 :(得分:2)
您的C#和PowerShell代码执行不同的操作。您在PowerShell中的其他位置输出,for
循环中的条件不同($i -le 1
vs i <= m
),您在PowerShell代码中增加$k
({{1但不是在C#代码中,你的交换以及参数处理是完全错误的。函数调用$k = $k+1
将数组foo(a, b, c)
传递给a, b, c
的第一个参数,而不传递给第二个和第三个参数。在PowerShell中使用三个参数foo()
,foo()
和a
调用b
的正确方法是c
。对于交换数组元素,只需使用数组元素。不要先将它们分配给变量。
如果您实际实现了相同的逻辑,那么PowerShell代码将按预期工作:
foo a b c