-3

假设我们有如下的贷款用户列表:

  • 贷款1
  • 贷款2
  • 贷款3
  • ...
  • 贷款10

并且我们有可以接受 2 到 10 笔贷款的功能: function(loans). 例如,以下是可能的:

  • function(loan1, loan2)
  • function(loan1, loan3)
  • function(loan1, loan4)
  • function(loan1, loan2, loan3)
  • function(loan1, loan2, loan4)
  • function(loan1, loan2, loan3, loan4, loan5, loan6, loan7, loan8, loan9, loan10)

如何编写代码以将所有可能的组合传递给该函数?

4

3 回答 3

2

RosettaCode 上,您已经实现了多种语言的生成组合,请自行选择。

于 2012-09-11T16:25:14.430 回答
0

下面是我们如何在 ruby​​ 中做到这一点:

loans= ['loan1','loan2', ... , 'loan10']

def my_function(loans)
  array_of_loan_combinations = (0..arr.length).to_a.combination(2).map{|i,j| arr[i...j]}

  array_of_loan_combinations.each do |combination|
    //do something
  end
end

致电:

my_function(loans);
于 2012-09-11T16:33:12.440 回答
0

我编写了一个类来处理处理二项式系数的常用函数,这是您的问题所属的问题类型。它执行以下任务:

将任何 N 选择 K 的所有 K 索引以良好的格式输出到文件。K-indexes 可以替换为更具描述性的字符串或字母。这种方法使得解决这类问题变得非常简单。

将 K 索引转换为已排序二项式系数表中条目的正确索引。这种技术比依赖迭代的旧已发布技术快得多。它通过使用帕斯卡三角形固有的数学属性来做到这一点。我的论文谈到了这一点。我相信我是第一个发现并发表这种技术的人,但我可能是错的。

将已排序二项式系数表中的索引转换为相应的 K 索引。我相信它可能比您找到的链接更快。

使用 Mark Dominus 方法计算二项式系数,它不太可能溢出并且适用于更大的数字。

该类是用 .NET C# 编写的,并提供了一种通过使用通用列表来管理与问题相关的对象(如果有)的方法。此类的构造函数采用一个名为 InitTable 的 bool 值,当它为 true 时,将创建一个通用列表来保存要管理的对象。如果此值为 false,则不会创建表。无需创建表即可执行上述 4 种方法。提供了访问器方法来访问表。

有一个关联的测试类,它显示了如何使用该类及其方法。它已经用 2 个案例进行了广泛的测试,并且没有已知的错误。

要了解此类并下载代码,请参阅 Tablizing The Binomial Coeffieicent。

将此类转换为您选择的语言应该不难。

为了解决您的问题,您可能需要编写一个新的贷款函数,该函数将贷款对象数组作为输入,并使用 BinCoeff 类处理这些对象。在 C# 中,要获取每个唯一组合的贷款数组,可以使用类似于以下示例代码的内容:

void LoanCombinations(Loan[] Loans)
{
   // The Loans array contains all of the loan objects that need
   // to be handled.
   int LoansCount = Loans.Length;
   // Loop though all possible combinations of loan objects.
   // Start with 2 loan objects, then 3, 4, and so forth.
   for (int N = 2; N <= N; N++)
   {
      // Loop thru all the possible groups of combinations.
      for (int K = N - 1; K < N; K++)
      {
         // Create the bin coeff object required to get all
         // the combos for this N choose K combination.
         BinCoeff<int> BC = new BinCoeff<int>(N, K, false);
         int NumCombos = BinCoeff<int>.GetBinCoeff(N, K);
         int[] KIndexes = new int[K];
         // Loop thru all the combinations for this N choose K.
         for (int Combo = 0; Combo < NumCombos; Combo++)
         {
            // Get the k-indexes for this combination, which in this case
            // are the indexes to each loan in Loans.
            BC.GetKIndexes(Loop, KIndexes);
            // Create a new array of Loan objects that correspond to
            // this combination group.
            Loan[] ComboLoans = new Loan[K];
            for (int Loop = 0; Loop < K; Loop++)
               ComboLoans[Loop] = Loans[KIndexes[Loop]];
            // Call the ProcessLoans function with the loans to be processed.
            ProcessLoans(ComboLoans);
         }
      }
   }
}

我没有测试过上面的代码,但总的来说它应该可以解决你的问题。

于 2012-09-26T15:48:18.983 回答