[英]I am trying to convert C code to Mathematica code, what am i doing wrong?
我是Mathematica的新手,似乎我缺少Mathematica语法中的某些内容。
我在下面复制了两个代码。
对于此示例,Print [second]必须返回120,但始终为0。
任何建议表示赞赏。
C:
int row = 4;
int column = 10;
int passenger = 5;
int luggage = 20;
int arrival = 15;
int walking = 5;
int second = 0;
int waitingtime = 0;
int _yolcu = 0;
for (int i = 0; i <row; i++)
{
waitingtime = 0;
if (_yolcu == passenger)
break;
for (int j = 0; j < column; j++)
{
if (_yolcu == passenger)
break;
_yolcu++;
if (i == 0 && j == 0){
second = second + luggage;
continue;
}
else
{
waitingtime = 0;
waitingtime =second-(j * walking + arrival * (_yolcu - 1));
if (waitingtime>= 0)
{
second = second + walking + luggage;
}
else
second = second - waitingtime+luggage;
}
}
}
Mathematica:
row = 4;
column = 10;
passenger = 5;
luggage = 20;
arrival = 15;
walking = 5;
second = 0;
waitingtime = 0;
_yolcu = 0;
For[i = 0, i < row, i++, waitingtime = 0;
If[_yolcu == passenger, Break[],
For[j = 0, j < column, j++,
If[_yolcu == passenger, Break[], _yolcu++;
If[i == 0 && j == 0, second = second + luggage,
waitingtime = second - (j*walking + arrival*(_yolcu - 1));
If[waitingtime >= 0, second = second + walking + luggage,
second = second - waitingtime + luggage]]]]]]
Print[second]
这个
_yolcu
不是有效的Mathematica符号名称,因此表达式_yolcu = 5
不会导致Mathematica将名为_yolcu
的值为5
的变量放入上下文符号表中。 尝试以交互方式执行该语句,然后尝试再次执行_yolcu
; Mathematica将(或为我这样做)返回_yolcu
而不是5
。
实际上_yolcu
是与Head
yolcu
匹配的模式 。 通常,任何以下划线开头的表达式都是模式。 下划线在Mathematica符号名称中无效。 诸如_yolcu++
类的表达式不会使_yolcu
的值_yolcu
。 我实际上不知道它的作用,除了在执行该语句时会产生错误外,还不知道是什么。 也许您的代码实际上从未实现过。
如果您还不了解Mathematica模式,建议您阅读文档。
而且,在我撰写本文时,您所做的工作与将C代码转换为Mathematica的方式看起来有细微的差别,看起来好像您已经将C代码转换为“ C-in-Mathematica”一样。 我认为您最好花时间对C进行逆向工程以使其符合问题规范,然后为该问题编写Mathematica解决方案。 我认为这是您的基本错误,对下划线的混淆只是对Mathematica的语法不熟悉。
很高兴您可以使用它,但是参考HPMark的最后一段,Mathematica中迭代循环的性能令人沮丧。 要编写良好的Mathemaitca表达式,您需要考虑将函数应用于列表的方式,以实现相同的目的。 类似于列表是展开的Do循环,实际上,遍历此列表可实现迭代。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.