查找 1 和 2 的可能组合,总和为常数
Posted
技术标签:
【中文标题】查找 1 和 2 的可能组合,总和为常数【英文标题】:Finding possible combinations of 1 and 2 with a constant sum 【发布时间】:2011-06-10 10:38:09 【问题描述】:这是在 C 中完成的任务。你能告诉我如何处理吗?
火车的长度为 n 米。它由长度为 1 或 2 米的独立隔间组成。对于给定长度的火车,有多少种不同的车厢组合?编写一个函数Train (n)
来计算它。
【问题讨论】:
这不是学校作业吗? 要用“C 语言”来完成,那么为什么是 Java 标记? 如果要在c中完成,'java'标签有点不合适。如果是作业,请考虑在标签中添加“作业” 【参考方案1】:从最简单的案例开始,寻找规律。
Train (1)
显然是 1: (1)。
Train (2)
显然是 2: (1 1) 和 (2)。
Train (3)
是 3:(1 1 1)、(1 2) 和 (2 1)。前两个可以组合成联合 (1) 和 (1 1) 和 (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) 与 (1 1) 和 (2) 的结合,它们是 Train (2)
的组合。所以,Train (4)
是Train (3) + Train (2)
。现在,回顾Train (3)
,我们看到+ 1
是Train (1)
。
现在似乎很清楚Train (n)
始终是Train (n - 1) + Train (n - 2)
。这正是斐波那契数列的定义。
现在,让我们看看它是如何翻译成 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);
如果你现在只是将最后一个代码 sn-p 粘贴到你的作业中,而没有完成“太长,没读过”的准备工作,我已经成功地破坏了你的教育,你将永远学不会编程。不客气。
这不是计算斐波那契数的最佳方法。为什么?您应该如何修改代码以避免重复工作?是否有不同的方法可以想象?哪些?
【讨论】:
非常感谢老兄。,U 的 END 评论真的很好。【参考方案2】:这是一个简单的fibonacci sequence。
对于任何长度为n
的火车,第一辆购物车的长度可以是1 或2。这就引出了f(n) = f(n - 1) + f(n - 2)
公式。
我可能不必告诉你如何计算斐波那契数。
【讨论】:
【参考方案3】:我猜这个递归公式回答了这个问题 如果 (n 火车(n) = 火车(n-1) + 火车(n-2)
【讨论】:
非常感谢老兄。为您提供帮助以上是关于查找 1 和 2 的可能组合,总和为常数的主要内容,如果未能解决你的问题,请参考以下文章