Loops 循环使用所有可能的方法,从n个正确猜测中选择x
我有10件物品。每个对象可以处于3种状态:1、2或3。让我们看看结果1111111。对于这一结果(或任何其他结果),我尝试通过所有方法循环,从10个猜测中找出8个是正确的。例如,21111111就是其中之一。我已经通过下面的循环成功地使它与9/10一起工作,但是我需要帮助使它与8/10和7/10一起工作 为了简单起见,让我们假设我们所检查的唯一组合是1111Loops 循环使用所有可能的方法,从n个正确猜测中选择x,loops,math,combinations,probability,Loops,Math,Combinations,Probability,我有10件物品。每个对象可以处于3种状态:1、2或3。让我们看看结果1111111。对于这一结果(或任何其他结果),我尝试通过所有方法循环,从10个猜测中找出8个是正确的。例如,21111111就是其中之一。我已经通过下面的循环成功地使它与9/10一起工作,但是我需要帮助使它与8/10和7/10一起工作 为了简单起见,让我们假设我们所检查的唯一组合是1111 Dim incorrectcombos As New Text.StringBuilder For i = 2 To 3
Dim incorrectcombos As New Text.StringBuilder
For i = 2 To 3
For j = 0 To 9
Dim combo As New Text.StringBuilder
For k = 0 To 9
If k = j Then
combo.Append(i)
Else
combo.Append(1)
End If
Next
incorrectcombos.AppendLine(combo.ToString)
Next
Next
MessageBox.Show(incorrectcombos.ToString)
递归方法非常简单。Delphi代码(注意Delphi字符串是基于1的) C#():
使用系统;
公开课考试
{
静态公共void GenerateCombs(字符串s、int-MaxLen、int-Position、int-ErrCount)
{
如果(位置==MaxLen+1)
{
控制台。写入线(s);
返回;
}
如果(错误计数0)
{
生成密码(s+“2”,最大,位置+1,错误计数-1);
生成密码(s+“3”,最大,位置+1,错误计数-1);
}
}
公共静态void Main()
{
生成模板(“”,4,1,2);
}
}
我不确定如何在.net代码中实现这一点。如果我不包括“开始”换行部分,它几乎可以工作(除了在每个组合的末尾增加1)。如果包括在内,它只是在第一部分无限循环。编辑:显然“开始”是所有Delphi程序的一部分。“Else begin”的确切含义是什么。。end=={..}这是有效的。你能想出更容易概念化和修改的非递归解决方案吗?我使用它的目的比我的例子要复杂一些。是的,非递归是可能的,但更复杂。您可以生成初始字符串,如1122、11231133
,并对每个字符串应用next permutation
算法。您是否大致了解代码的外观?我能够构建一个非常慢的版本,它使用的组合远远超过了需要的组合,然后丢弃了重复的组合,这是非常慢的。
procedure GenerateCombs(s: string; MaxLen, Position, ErrCount: Integer);
begin
if Position = MaxLen + 1 then
Memo1.Lines.Add(s) //output string
else begin
if ErrCount <= MaxLen - Position then
GenerateCombs(s + '1', MaxLen, Position + 1, ErrCount);
if ErrCount > 0 then begin
GenerateCombs(s + '2', MaxLen, Position + 1, ErrCount - 1);
GenerateCombs(s + '3', MaxLen, Position + 1, ErrCount - 1);
end;
end;
end;
begin
GenerateCombs('', 4, 1, 2);
1122
1123
1132
1133
1212
1213
1221
1231
1312
1313
1321
1331
2112
2113
2121
2131
2211
2311
3112
3113
3121
3131
3211
3311
using System;
public class Test
{
static public void GenerateCombs(string s, int MaxLen, int Position, int ErrCount)
{
if (Position == MaxLen + 1)
{
Console.WriteLine(s);
return;
}
if (ErrCount <= MaxLen - Position)
{
GenerateCombs(s + "1", MaxLen, Position + 1, ErrCount);
}
if (ErrCount > 0)
{
GenerateCombs(s + "2", MaxLen, Position + 1, ErrCount - 1);
GenerateCombs(s + "3", MaxLen, Position + 1, ErrCount - 1);
}
}
public static void Main()
{
GenerateCombs("", 4, 1, 2);
}
}