arrays - 返回可能组合数的递归函数

标签 arrays math recursion

我参加了面试,被问到一个问题,我想了解解决方案。

问题

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

f(array, length) = 组合

例子1

  • 数组 = [0,1,2,3]
  • 长度 = 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

  • 数组 = [0,1]
  • 长度= 3
  • 组合 = 4(所有组合:[0,0,0] [0,0,1] [0,1,1] [1,1,1])

提供了一个“提示”。面试官说数组本身应该无关紧要;长度是所需要的。

最佳答案

这个算法可以递归地表示,因为解决方案可以用较小输入的解决方案来表示。这里的“小”有两层意思:

  • 数组的一个子集;具体是当前元素索引之后的子数组

  • 更短长度的解决方案;这些可以加在一起得到长度 + 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 那样解释清楚。也考虑给予他的回答信用。

关于arrays - 返回可能组合数的递归函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45486256/

相关文章:

java - 在不使用 ArrayList 的情况下创建一个具有原始数组重复元素的数组?

java - 创建并填充二维数组

c++ - 可以指定其基础的日志的 C++ 实现?

c# - 如何在椭圆内绑定(bind)一个圆?

swift - 使用完成处理程序调用自己的函数

Javascript 拼接正在删除除请求的元素之外的所有内容

ruby-on-rails - 在 Rails 5 中存储 Jsonb 的 Postgres 数组意外转义字符串

python - math.exp() 对于 float 返回 0

haskell - 使用 mfix 避免无限递归

html - 栅栏问题 : I need a recursive function that skips executing a section when it is first called