注册 登录
编程论坛 VFP论坛

求证组合排列程序是否正确

whinda 发布于 7 天前 17:25, 843 次点击
近期写个对账小程序,应收款数笔,实际回款数笔。
思路是由账面应收款序列,生成所有组合,和实际收款的数据序列生成的组合,进行比对。
先写了个验证小程序,统计学上课没听,害怕有误,请大师指点下。
程序代码:

genComb(1,0,'',10)&&10以内的非重复全部组合

Procedure genComb
    Lparameters startIndex,nSum,cStrCombination,nLen
    LOCAL i
    For i=startIndex To nLen
        Local nToal,cString
        cString=cStrCombination+','+Alltrim(Str(i))&&由哪几笔组成
        nTotal=nSum+i&&求和
        ?nTotal,cString
        If i=nlen
            RETURN
        Else
            genComb(i+1,nTotal,cString,nLen)
        Endif
    Endfor
Endproc
14 回复
#2
吹水佬7 天前 17:35
用递归,算量大时可能会出异常。
#3
whinda7 天前 17:35
10个数,不重复全部组合序列有多少个,不会计算。程序跑出来是1023,不知道是否正确
#4
whinda7 天前 17:37
通常也就20笔以内,想到可以128层嵌套,就用了递归
#5
吹水佬7 天前 18:59
有无可能会是20个数任意1个、2个、3个.......19个、20个数的组合
#6
sych7 天前 19:36
可以通过控制excel,利用线性规划求解,速度快
#7
whinda6 天前 00:59
回复 5楼 吹水佬
现在就是生成序列N的1、2、3...N的组合,而且不重复。用小一点的数代入N,目前测得结果好像是对的。就是怕逻辑上有缺陷。
#8
whinda6 天前 01:03
只是验证,实际操作会把应收数序列存入数组,通过数组下标来访问,实现组合
#9
吹水佬6 天前 05:31
以下是引用whinda在2025-8-28 00:59:42的发言:

现在就是生成序列N的1、2、3...N的组合,而且不重复。用小一点的数代入N,目前测得结果好像是对的。就是怕逻辑上有缺陷。

为节省时间,方便的话最好给点数据测试一下
#10
吹水佬6 天前 06:52
以下是引用whinda在2025-8-27 17:37:13的发言:

通常也就20笔以内,想到可以128层嵌套,就用了递归

如果有其他算法,最好不要用递归,一来不好读懂,二来也不见得高效,尤其是vfp这类解释语言,循环的嵌套层次尽量要少。
#11
sych6 天前 06:54
组合是一个很大的数,理论上成立,实际上不可取
#12
yiranlj6 天前 10:13
只是验证,实际操作会把应收数序列存入数组,通过数组下标来访问,实现组合
#13
吹水佬6 天前 11:24
如果应收与实收是多对多时,实际操作没那么简单。
#14
whinda6 天前 11:59
感谢指正。试了一下,20个数的话,不重复组合超过百万条,比对效率稍慢。已经把序列控制在15个因子内,有36000多个组合,应收应付组合先存数组,最后一次性写表,select双表比较,作分段切割比较。短期内应急用,就先这样了。后面再考虑其它算法了。感谢各位。
#15
hsfisher6 天前 21:01
学习了
1