在 for 循环中找到最小值并保留它的索引
Posted
技术标签:
【中文标题】在 for 循环中找到最小值并保留它的索引【英文标题】:Finding a minimum value in a for loop and keeping the index of it 【发布时间】:2012-06-07 22:35:02 【问题描述】:我正在做一个家庭作业,我在一个“for”循环中计算一个函数 (f(x) = x * x – 12 * x + 40) 的整数区间中的值。我需要找到一个最小值。没关系,但我还需要保留值最小的索引号。目前我在另一个循环中再次重申该功能,但这看起来真的很混乱。我也可以导出 x 并使用已知最小值计算答案,但这也很奇怪,因为推导不是那么简单。你对我有什么建议吗?谢谢。
#include <iostream>
#include "limits.h"
using namespace std;
int main ()
int lBound, uBound, y, min;
cout << "Give the lower and the upper bounds of integer numbers: " << endl;
cin >> lBound >> uBound;
min=INT_MAX;
int x = lBound;
for (int i = x; i <=uBound; i ++)
y = i * i - 12 * i + 40;
cout << x << " " << y << endl;
if (y<min)
min=y;
x++;
for (int i = lBound; i <= uBound; i++)
y = lBound * lBound - 12 * lBound + 40;
if (y==min)
y = lBound;
i=uBound; // terminates the loop
lBound++;
cout << "smallest value of the function is " << min << " for x = " << y << endl;
return 0;
【问题讨论】:
粘贴代码时请点击
按钮。 (发帖前请先看预览。)询问作业时请使用作业标签。
这个问题我们无法给出正确答案,因为这是家庭作业。这完全取决于导师的意图。也许您应该使用微积分来找到最小值。 (毕竟,根据多项式,它们可能不是唯一值或整数值。)也许您应该将事物存储在数组中。都有优点和缺点,这可能与作业无关。
所以你设法将最小值“y”保存在“min”中,但想不出将“i”保存到“minI”变量中的方法?
我理解需要保存相应最小值的“i”。我无法理解的是 min 只有在循环过去后才知道,因此所有“i”也都过去了......
【参考方案1】:
这里有一个提示:当你需要在程序中“保留一些东西”时,这意味着你需要将它存储在一个变量中。该变量是本地的、全局的还是传递的,取决于您需要保留它多长时间。这称为变量的“范围”。将任何变量的范围保持在最低限度被认为是一种很好的做法,因此指南不鼓励使用全局变量。
【讨论】:
+2。不,*** 的软件不允许 +2。也许 +3 会起作用....这是一个很好的答案。 好吧,这样我存储了最小值,但我只有在循环通过后才知道。抱歉,我仍然没有看到解决方案... 是的,你只知道它是循环完成后的最小值。min()
充其量是一个 O(N) 算法,这意味着它随着数据点的数量而缩放。这就是生活。【参考方案2】:
i=uBound; // terminates the loop
这不是一个很好的编码习惯。要终止循环,您应该使用像break
这样的流控制结构。在这种情况下这样做会保留最小元素的索引。
编辑:如果你想让i
比循环更有效,你只需要在外面声明它。也就是说:
改变
for (int i = lBound; i <= uBound; i++)
到
int i; // variable exists outside loop
for (i = lBound; i <= uBound; i++)
此外,仅供参考,循环边界通常指定为half-open intervals,以避免lbound
和ubound
表示int
数据类型的限制的潜在问题。这意味着您通常使用<
而不是<=
。
不清楚你是上代数课还是CS课……
【讨论】:
不,因为i
超出范围。
感谢您的提示,这很有意义。
我知道这一点,我也可以将“i”分配给 for 循环之外的另一个变量,但它仍然不会导致解决方案附近的任何地方。这是我正在做的 C++ 入门课程。
感谢您的帮助。我被困在“盒子里”。明白了显而易见的事情后,我松了一口气。以上是关于在 for 循环中找到最小值并保留它的索引的主要内容,如果未能解决你的问题,请参考以下文章