如何将for循环变成数学方程?
Posted
技术标签:
【中文标题】如何将for循环变成数学方程?【英文标题】:How to turn for loop into a math equation? 【发布时间】:2016-07-06 18:01:20 【问题描述】:我的程序中有以下两个循环,我试图将它们写成数学方程式,但我很难找到一种简洁的方法:
// Loop1
for (int i = 0; i < nr; i++)
array[i] = nepr;
// Loop2
for (int i = 0; i < (nvr % nr); i++)
array[i]++;
代码是完整的函数,但我试图在我正在编写的文档中表达这些循环。
非常感谢任何帮助。
到目前为止,我有这个:
array[i] = nepr, i = 0,...,(nr-1)
但我不确定如何将第二个循环合并到方程中,或者为其编写第二个方程。
【问题讨论】:
【参考方案1】:只需将其表达为piecewise-defined function:
f(x) = nepr + 1 if x < (nvr % xr)
nepr if x >= (nvr % xr)
你也可以用Heaviside step function来定义它:
f(x) = nepr + H((nxr % xr) - x)
【讨论】:
我相信你的符号没有考虑到 x 是离散值的。你的方程是 x 是连续的。如果我错了,请纠正我。 @Veridian 这不是直接必要的,方程仍然有效。如果要表示x必须是整数,单独声明即可。 @chux 似乎 nvr 总是积极的,但我还是改变了它。 是的,假设nvr, nr
肯定会简化问题。怀疑 OP 是否想要完整的int
解决方案。【参考方案2】:
不完全清楚这就是你要问的,但以下在一个循环中做同样的事情。
for (int i = 0, j = nvr % nr; i < nr; i++)
array[i] = nepr + (i < j);
[编辑] 在没有任何循环的随意语言中,以上等同于...
让
j = nvr % nr
。假设正面nr
和nvr
,0 <= j < nr
和:array[i] = nepr + 1
为i = 0 ... j-1
array[i] = nepr
为i = j ... nr-1
【讨论】:
谢谢,我想我可以这样做:array[i] = nepr + (i 假设需要肯定。代码确实失败了nvr = 7; nr = -3;
@chux 对。我编辑了答案以阐明积极性假设。【参考方案3】:
在您的第二个循环中,条件检查有很多 nr-1
。
如果我理解你的问题,你可以这样表达
array[i] = array[i] + 1 , i = nvr % nr ,...,(nr-2)
【讨论】:
缺少对nvr的依赖 @Veridian 什么样的依赖?最终你会使用nvr % nr
值,对吧?【参考方案4】:
这是在 LaTeX 中。要查看或编辑 LaTeX,请单击方程式。
:=
符号表示赋值。您也可以通过将array_i
替换为array(i)
(一个定义在开放整数范围上的函数)以函数方式编写它。
【讨论】:
可能你应该加上 i ∈ N @Logman 似乎与 i 被用作数组的索引这一事实有关 @GuyGreer 但让我们保持正式;)【参考方案5】:我想我会尝试在@dxiv 的基础上发布完整的int
范围搜索,这在nr, nvr
是肯定的情况下效果很好 - 通常情况下。
假设nr, nvr
是int
。
assert(nr != 0);
assert(nr != -1 || nvr >= -INT_MAX); // avoid -2147483648 % -1
int j = nvr % nr;
int ij = max(i,j);
for (int i = 0; i < ij; i++)
array[i] = nepr + (i < j);
【讨论】:
以上是关于如何将for循环变成数学方程?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 for 循环将一段重复的 javascript 打印到 HTML 文档?