这是一项在C中完成的任务。你能告诉我如何处理这个问题吗?
火车的长度为 n 米。它由1或2米长的独立隔间组成。对于给定长度的列车,存在多少种不同的隔室组合?编写一个计算此函数的函数Train (n)
。
答案 0 :(得分:2)
从最简单的案例开始,寻找规律性。
Train (1)
显然是1:(1)。Train (2)
显然是2:(1 1)和(2)。Train (3)
是3:(1 1 1),(1 2)和(2 1)。前两个可以组合成联合(1)和(11)resp(2)。后者恰好是Train (2)
的组合。因此,Train (3)
是Train (2) + 1
。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)
,我们发现+ 1
是Train (1)
。现在很明显Train (n)
总是Train (n - 1) + Train (n - 2)
。这正是Fibonacci序列的定义。
现在,让我们看看如何将其转换为C.
函数框架:Train
接受一个整数参数并返回一个整数:
int Train (int n) {
}
我们制定的定义:
int Train (int n) {
return Train (n - 1) + Train (n - 2);
}
这将无限递归,所以我们需要在基本情况下停止它。一个基本案例很清楚:Train (1)
是1:
int Train (int n) {
if (n == 1) {
return 1;
} else {
return Train (n - 1) + Train (n - 2);
}
}
这仍然不够。想象一下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);
}
}
这样可行,但我们可以简化基本情况:
int Train (int n) {
if (n < 3) {
return n;
} else {
return Train (n - 1) + Train (n - 2);
}
}
如果您现在只是将最后一段代码段粘贴到您的作业中,而没有通过“太长时间,没有阅读”的预备课程,我已经成功地破坏了您的教育,您将永远不会学习编程。不客气。
这不是计算斐波纳契数的最佳方法。为什么?您应该如何修改代码以避免重复工作?是否有可以想象的不同方法?哪些?
答案 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)