我接受了采访,并被问到一个我想了解解决方案的问题。
创建一个递归函数,该函数返回给定长度的数组的可能组合数,这些数组可以由非重复连续整数数组组成。
f(数组,长度)=组合
一个"提示"被提供。采访者说阵列本身并不重要;长度就是所需要的。
答案 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
的数组,只需要计算元素r
或r-1
或...后面的数组数量。 0
。这样可以方便编码 - 不需要太多内存。事实上,事情可以进一步减少 - 我会把它留给你。
请注意,面试官可能不想要代码,他希望您的思考过程能够让代码看到您的思维方式。这是通过思考问题的一种方式。