我正在研究一个需要我移动机器人的学校项目。机器人每秒移动的距离(变量t)由下面的函数计算。
第一个功能很简单。第二个和第三个是我被卡住的地方。我怎么写F(t-1)?以下是我到目前为止的情况。
if (t == 0) {
distance = 2;
} else if (t > 0 && <=6 || t > 12) {
// No clue on how to write the 2nd distance equation.
} else if (t >= 7 && <=12) {
// No clue on how to write the 3rd distance equation.
}
答案 0 :(得分:5)
Recursion实际上没有必要解决这个问题。
请注意,在每个非零时间情况下,F(t) = F(t-1) + something
。
所以你可以这样做:
double f = 2; /* Initial value at t=0 */
for (int t = 1; t <= maxT; ++t) { // maxT is the maximum value of t.
if (t <= 6 || t > 12) {
f += /* something for case 2 */;
} else {
f += /* something for case 3 */;
}
}
System.out.println(f);
你可以通过递归执行此操作,但如果StackOverflowError
变得适度大,您将获得maxT
;相反,使用循环将适用于任意大maxT
(模数浮点错误)。
正如@Andreas指出的那样,你可以在不循环t
的所有值的情况下执行此操作:
double f = 2 * (maxT + 1);
for (int t = 7; t <= maxT && t <= 12; ++t) {
f += log(t) - 2;
}
并且您可以通过预先计算值来消除该循环。
答案 1 :(得分:2)
这是一个涉及使用recursion的问题。总的来说,要密切关注 F t-1 的符号,因为这是指t-1
对特定函数的评估。
我不会写出所有代码,但我会给你一些基础知识:
至少可以让你开始朝着正确的方向前进。
public double evaluateDistance(int t) {
if(t == 0) {
return 2;
} else if(t > 0 && t <= 6) || (t > 12) {
// Think about this - it would involve another call to evaluateDistance, but what is t again?
} else if(t >= 7 && t <= 12) {
// Another evaluation involving the function.
// For free, the change of base operation you'll need to get base-2 evaluation for the log:
return ??? + Math.log(t)/Math.log(2);
}
}
答案 2 :(得分:0)
想想我弄清楚了。对不起,如果我不清楚我需要什么,只需要弄清楚如何在函数中编写方程。我想我想通了。
public double move()
{
int t = 0;
if(t == 0) // After the first second, robot moves 2
{
distance = 2;
}
else if(t > 0 && t <= 6 || t > 12) // From seconds 0 to 6 and after 12, robot moves distance equation
{
distance = (2*t)+2;
}
else if(t >= 7 && t <= 12) // From seconds 7 to 12, robot moves distances equation
{
distance = (2*t)+(Math.log(t)/Math.log(2));
}
position = position + distance;
return position;
}
}