我是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;
}
}
}
数学:
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]
答案 0 :(得分:2)
此
_yolcu
不是有效的Mathematica符号名称,因此表达式_yolcu = 5
不会导致Mathematica将值为_yolcu
的变量5
放入上下文符号表中。尝试以交互方式执行语句,然后再次尝试执行_yolcu
; Mathematica会(或者更确切地说,对我而言)返回_yolcu
而不是5
。
事实上,_yolcu
是模式,它与Head
yolcu
匹配。通常,以下划线开头的任何表达式都是模式;下划线在Mathematica符号的名称中无效。诸如_yolcu++
之类的表达式不会增加_yolcu
的值。我实际上并不知道它的作用,除了在执行语句时产生错误;也许你的代码实际上并没有碰到它。
如果您还不了解Mathematica模式,建议您查看文档。
而且,在我写作的时候,你所做的事情看起来与将C代码翻译成Mathematica略有不同,它看起来更像是将C代码翻译成'C-written-in-Mathematica`。我认为你的时间最好花在对C问题规范进行逆向工程,然后编写Mathematica解决方案来解决问题。我认为这是你的基本错误,对于下划线的困惑只是对Mathematica的语法不熟悉。
答案 1 :(得分:0)
很高兴你得到了它,但是参考HPMark的最后一段,Mathematica中迭代循环的性能令人沮丧。要编写好的Mathemaitca表达式,您需要考虑以实现相同的方式将函数应用于列表。有点像列表是一个未滚动的Do循环,实际上,迭代是通过遍历此列表来实现的。