计算`permutations xs`的`length`

时间:2017-01-13 14:12:34

标签: math functional-programming

在Haskell的GHCi中,输入length$ permutations [1..8]即时。 length$ permutations [1..16] permutations xs您可能会看到......分钟,小时?如果我们想要的只是length 生成的结果的实际数量(即不需要通过它们),显然必须有一个简单的廉价公式,只知道{{1} } xs

我很遗憾数学速度慢,但鉴于len = length xs,我注意到答案是通过给予len任何正面的numofperms 0 = 0 numofperms 1 = 1 numofperms ln = ln * (numofperms (ln - 1)) 来找到的。

permutations

虽然这显然比评估所有(x * (x+-foo ^ bar))更快,但为什么要递归!我确定有一个'公式'躲在那里我无法立即/直观地看到。如何将上述逻辑转换为简单的非递归数学计算? "带有阶乘的东西"还是一些这样的?

在您标记为重复之前:我确定我可以轻松找到&#34;哪个公式给出排列数的答案&#34;很容易在这里或者其他地方,但真正的问题(如果允许这种格式)是如何从直观编写的递归逻辑跳转到更便宜和正确的计算,如<div class="form-group" [ngClass]="{'has-error':!form3.controls['cadBanco'].valid && form3.controls['cadBanco'].touched}"> <label class="col-sm-2 control-label">Cadastrar dados bancários?</label> <div class="input-group"> <input formControlName="cadBanco" type="checkbox" value="1" [(ngModel)]="form3.cadBanco" (change)="disableBanco($event)"> </div> </div><br /> <div class="form-group" [ngClass]="{'has-error':!form3.controls['pessoa'].valid && form3.controls['pessoa'].touched}"> <label class="col-sm-2 control-label">Tipo de pessoa:</label> <div class="input-group"> <div class="btn-group" data-toggle="buttons" [class.invalid]="form3.controls['pessoa'].touched && !form3.controls['pessoa'].valid"> <label class="btn btn-default active"> <input type="radio" [(ngModel)]="form3.pessoa" formControlName="pessoa" value="1" [class.invalid]="form3.controls['pessoa'].touched && !form3.controls['pessoa'].valid"/> Pessoa jurídica </label> <label class="btn btn-default"> <input type="radio" [(ngModel)]="form3.pessoa" formControlName="pessoa" value="2" [class.invalid]="form3.controls['pessoa'].touched && !form3.controls['pessoa'].valid"/> pessoa física </label> </div> </div> <div *ngIf="form3.controls['pessoa'].hasError('required') && form3.controls['pessoa'].touched" class="alert alert-danger">Preencha o campo tipo de pessoa.</div> </div> 中所示 - 这可以对于将来到这里的其他新手功能程序员来说,这肯定会成为一个教育线索!

1 个答案:

答案 0 :(得分:2)

这个不正确:

numofperms 0 = 0

0个元素的排列数为1(permutations [] == [[]])。考虑到这一点,也许有助于缩短时间:

f(0) = 1
f(n) = n * f(n - 1)

看起来很熟悉?这是n! - factorial