用于打印给定元素的排列和组合的程序

时间:2016-07-18 11:20:59

标签: powershell

我在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#输出:

enter image description here

1 个答案:

答案 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