递归函数,返回可能的组合数

时间:2017-08-03 13:52:03

标签: arrays math recursion

我接受了采访,并被问到一个我想了解解决方案的问题。

问题

创建一个递归函数,该函数返回给定长度的数组的可能组合数,这些数组可以由非重复连续整数数组组成。

f(数组,长度)=组合

示例1

  • array = [0,1,2,3]
  • length = 2
  • 组合= 10(所有组合:[0,0] [0,1] [0,2] [0,3] [1,1] [1,2] [1,3] [2,2] [2,3] [3,3])
  • 请注意,[0,0]是允许的,但[1,0]不是因为定义了[0,1]

示例2

  • array = [0,1]
  • length = 3
  • 组合= 4(所有组合:[0,0,0] [0,0,1] [0,1,1] [1,1,1])

一个"提示"被提供。采访者说阵列本身并不重要;长度就是所需要的。

2 个答案:

答案 0 :(得分:4)

该算法可以递归表示,因为解决方案可以用较小输入的解决方案表示。 “小”这里有两个含义:

  • 数组的一个子集;特别是当前元素索引

  • 之后的子数组
  • 长度较小的解决方案;这些可以加在一起,给出长度+ 1

  • 的解决方案

停止条件:

  • 当数组大小为A = 1时 - 只能生成一个组合

  • 当长度L = 1 - 组合数量=数组中的元素数量

完全递归的过程非常简单:

return [recursive call to rest of array, same length] + 
       [recursive call to same array, length - 1]

这称为动态编程

代码:

int F(int A, int L)
{
    if (A <= 1) return 1;
    if (L <= 1) return A;
    return F(A - 1, L) + F(A, L - 1);
}

试验:

  • F(4, 2) = 10
  • F(2, 3) = 4
  • F(3, 5) = 21(用纸笔跟踪以便自己查看)

编辑:我给出了一个优雅而简单的解决方案,但我可能没有像@RoryDaulton那样解释它。考虑给予他的回答信用。

答案 1 :(得分:2)

您没有提供目标语言,也没有说明您需要多少帮助。因此,如果您知道某种语言的递归,我将给出一个算法的总体思路,该算法应该很容易编码。询问您是否需要更多Python代码,这是我当前的首选语言。

你知道你需要做递归,你有两件事可以解决:给定数组的长度或所需数组的长度。让我们对第二个进行递归,让我们说给定的数组是[0, 1, ..., n-1],因为你知道实际的内容是无关的。

如果所需的r长度为1,您知道只有n个所需数组,即[0][1],...,{{ 1}}。所以你的递归有基本情况。

如果你有&#34;组合&#34;长度[n-1],如何将其扩展到r-1长度并保持要求?查看长度为r的数组中的最后一个元素 - 让我们将其称为r-1。下一个元素不能小于,因此扩展到k长度的所有可能数组都是附加r,...,r-1的{​​{1}}数组。这些是k', 'k+1长度为n-1的数组。

是否清楚如何编码?请注意,您不需要保留所有长度为n-k的数组,只需要计算元素rr-1或...后面的数组数量。 0。这样可以方便编码 - 不需要太多内存。事实上,事情可以进一步减少 - 我会把它留给你。

请注意,面试官可能不想要代码,他希望您的思考过程能够让代码看到您的思维方式。这是通过思考问题的一种方式。