c# - 找出 1 和 2 的所有组合,加起来等于 N

标签 c# algorithm

假设我有一个这样的函数。我需要知道加起来等于 N 的 1 和 2 的所有组合。是否有更好的方法来编写此代码,以便对 N = 1200 或 12000 等大整数执行得更好?

public static int Combos(int n)
{
    if (n < 3)
    {
        return n;
    }
    else
    {
        return Combos(n - 1) + Combos(n - 2);
    }
}

最佳答案

Find all combinations of 1 and 2 that add up to N

因此,您需要组合不是排列

让我们看一些例子-

  • 1 = {1}
  • 2 = {1,1}, {2}
  • 3 = {1,1,1}, {1,2} (或 {2,1} ,两者相同)。
  • 4 = {1,1,1,1}, {1,2,1}, {2,2}
  • 5 = {1,1,1,1,1}, {1,2,1,1}, {2,2,1}
  • 6 = {1,1,1,1,1,1}, { 1,2,1,1,1} , {2,2,1,1} , {2,2,2} }
  • 7 = {1,1,1,1,1,1,1}, { 1,2,1,1,1,1} , {2,2,1,1,1} , {2, 2,2,1}

如果你观察,它看起来像这样-

  • 1 = 1
  • 2 = 2
  • 3 = 2
  • 4 = 3
  • 5 = 3
  • 6 = 4
  • 7 = 4
  • 8 = 5

您可以在O(1) 时间和O(1) 空间内解决这个问题,如下所示-

public static int Combos(int n){
    return n / 2 + 1;
}   

注意#1:如果您还需要值,那么它会花费更多的精力,但是对于您的代码,您似乎只想找到 no。的方式。

注意 #2:如果您注意到的话,查找实际值也不会花费太多精力。您根本不需要记住以前的结果。

关于c# - 找出 1 和 2 的所有组合,加起来等于 N,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52306454/

相关文章:

c# - 我可以告诉 C# 可空引用方法实际上是对字段的空检查吗

c# - 如何为 Windows Phone 7 应用程序构建持续集成

php - 标记未排序数组的前 N ​​个元素

algorithm - 匈牙利人脸匹配算法

c# - Twitter API + OAuth : Can't send status updates, 获取 401

c# - LINQ to XML 中的 XmlDocumentFragment 等效吗?

c# - 增加 C# 中 #DataGridView 中复选框的大小

java - 添加 0 和 1 是 java 中的交替数组单元格

algorithm - 给定两个范围 [a,b), [c,d),检查它们是否相交

java - 如何计算存储 N 位所需的 long(64 位)数?