Loops 循环使用所有可能的方法,从n个正确猜测中选择x

Loops 循环使用所有可能的方法,从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

我有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
        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);
    }
}