在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>
中所示 - 这可以对于将来到这里的其他新手功能程序员来说,这肯定会成为一个教育线索!
答案 0 :(得分:2)
这个不正确:
numofperms 0 = 0
0个元素的排列数为1(permutations [] == [[]]
)。考虑到这一点,也许有助于缩短时间:
f(0) = 1
f(n) = n * f(n - 1)
看起来很熟悉?这是n! - factorial。