找到具有常数和的1和2的可能组合

时间:2011-01-17 12:48:33

标签: c algorithm combinations

这是一项在C中完成的任务。你能告诉我如何处理这个问题吗?

火车的长度为 n 米。它由1或2米长的独立隔间组成。对于给定长度的列车,存在多少种不同的隔室组合?编写一个计算此函数的函数Train (n)

3 个答案:

答案 0 :(得分:2)

从最简单的案例开始,寻找规律性。

  1. Train (1)显然是1:(1)。
  2. Train (2)显然是2:(1 1)和(2)。
  3. Train (3)是3:(1 1 1),(1 2)和(2 1)。前两个可以组合成联合(1)和(11)resp(2)。后者恰好是Train (2)的组合。因此,Train (3)Train (2) + 1
  4. Train (4)是5:(1 1 1 1)(1 1 2)(1 2 1)(2 1 1)(2 2)。同样,我们可以将第一个组合为(1)和(1 1 1),(1 2)和(2 1),它们是Train (3)的组合。最后一个是(2)与(11)和(2)相结合,它们是Train (2)的组合。因此,Train (4)Train (3) + Train (2)。现在,回顾Train (3),我们发现+ 1Train (1)
  5. 现在很明显Train (n)总是Train (n - 1) + Train (n - 2)。这正是Fibonacci序列的定义。

    现在,让我们看看如何将其转换为C.

    1. 函数框架:Train接受一个整数参数并返回一个整数:

      int Train (int n) {
      }
      
    2. 我们制定的定义:

      int Train (int n) {
          return Train (n - 1) + Train (n - 2);
      }
      
    3. 这将无限递归,所以我们需要在基本情况下停止它。一个基本案例很清楚:Train (1)是1:

      int Train (int n) {
          if (n == 1) {
              return 1;
          } else {
              return Train (n - 1) + Train (n - 2);
          }
      }
      
    4. 这仍然不够。想象一下Train (2)做了什么:它将计算Train (1) + Train (0)Train (1)没有问题,但Train (0)会计算Train (-1) + Train (-2),这会再次无限地递归。所以,我们需要另一个基本案例:Train (2)是2。

      int Train (int n) {
          if (n == 1) {
              return 1;
          } else if (n == 2) {
              return 2;
          } else {
              return Train (n - 1) + Train (n - 2);
          }
      }
      
    5. 这样可行,但我们可以简化基本情况:

      int Train (int n) {
          if (n < 3) {
              return n;
          } else {
              return Train (n - 1) + Train (n - 2);
          }
      }
      
    6. 如果您现在只是将最后一段代码段粘贴到您的作业中,而没有通过“太长时间,没有阅读”的预备课程,我已经成功地破坏了您的教育,您将永远不会学习编程。不客气。

    7. 这不是计算斐波纳契数的最佳方法。为什么?您应该如何修改代码以避免重复工作?是否有可以想象的不同方法?哪些?

答案 1 :(得分:0)

这很简单fibonacci sequence 对于任何长度为n的列车,第一辆购物车的长度可以是1或2.这会将我们带到f(n) = f(n - 1) + f(n - 2)公式。

我可能不必告诉你如何计算斐波纳契数。

答案 2 :(得分:0)

我猜这个递归公式回答了问题

if(n <= 2)返回n
火车(n)=火车(n-1)+火车(n-2)