返回列表 发帖
$a = [System.Collections.Stack]::new()
function cr($n, $s, $a) {if($a.count -eq $n){return $a.toarray() -join ''}for($i=0;$i -lt $s.length;$i++){$a.push($s[$i]);cr $n $s $a;$a.pop()|out-null}}
1..3 | %{$a.clear();cr $_ "asdfg" $a}COPY

TOP

本帖最后由 wanghan519 于 2023-9-11 06:21 编辑

又试了一下,5楼因为递归次数较多就很慢,动态规划是算法上空间换时间的优化,确实快!
试了栈改成字符串操作并不改变速度,倒是因为把递归里的一层for循环展开导致递归次数变多,浪费的时间更多,结合官方文档说调用函数的成本高昂,调用函数是直接for循环耗时的20倍以上,所以暂时结论是powershell不适合写递归。。。
5楼的算法,用awk运行需要4秒(0-9选6个以内),而python里用itertools.product(s, repeat=n)只需要1秒多。。。
function combr(n, s, i) {
    if (length(s)==n) {
        print s
        return
    }
    for (i=1;i<=length($0);i++) {
        s = s substr($0, i, 1)
        combr(n, s)
        s = substr(s, 1, length(s) - 1)
    }
}COPY

TOP

试了一下官方的测试,powershell里调用函数的开销似乎格外大,所以暂时认为powershell不适合写递归吧。。。
要么4楼那样优化算法,要么用别的语言写递归
$ranGen = New-Object System.Random
$RepeatCount = 10000
'Wrapped in a function = {0}ms' -f (Measure-Command -Expression {
    function Get-RandNum_Core {
        param ($ranGen)
        $ranGen.Next()
    }
    for ($i = 0; $i -lt $RepeatCount; $i++) {
        $Null = Get-RandNum_Core $ranGen
    }
}).TotalMilliseconds
'For-loop in a function = {0}ms' -f (Measure-Command -Expression {
    function Get-RandNum_All {
        param ($ranGen)
        for ($i = 0; $i -lt $RepeatCount; $i++) {
            $Null = $ranGen.Next()
        }
    }
    Get-RandNum_All $ranGen
}).TotalMillisecondsCOPY

TOP

返回列表