Recursion 如何在MATLAB中正确使用递归?

Recursion 如何在MATLAB中正确使用递归?,recursion,matlab,Recursion,Matlab,我创建了一个简单的m文件作为递归函数: function[velocity] = terminal(m,c,t,vi) %inputs: % m = mass % c = coeffcient of drag % t = time % vi = initial velocity if t==18, velocity = vi+(9.8-c/m*(vi))*2; return end velocity = vi+(9.8-c/m*(vi))*2; velocity %used to

我创建了一个简单的m文件作为递归函数:

function[velocity] = terminal(m,c,t,vi)
%inputs:
% m = mass
% c = coeffcient of drag
% t = time
% vi = initial velocity

if t==18, velocity = vi+(9.8-c/m*(vi))*2;
    return 
end

velocity = vi+(9.8-c/m*(vi))*2;
velocity  %used to print out velocity for debugging
terminal(m,c,t+2,velocity);
end
当它打印出每个递归时,速度的计算是正确的。然而,最后返回的“ans”是递归的第一个计算值。我的问题是如何正确地递归设置matlab函数?或者可以这样做,使用循环更好吗

velocity = terminal(m,c,t+2,velocity)

应该能用。

请容忍我,我已经有一段时间没有做很多Matlab了

但我只需迭代调用您的函数:

velocity = vi
for t = 0:2:18
    velocity = velocity+(9.8-c/m*(velocity))*2;
end
然后,对于t的每个实例,它将计算给定初始速度的速度,并用它的新速度更新该值

要让它以2的大小执行增量步骤


虽然我的答案将偏离编程而进入微积分领域,但应该注意的是,你可以不用递归或循环来解决你的问题,因为你可以使用积分精确地解方程
v(t)
。看起来您是在一个下落物体上建模,因此您可以使用来计算下落一段时间后达到的最终速度
vFinal
,给定起始速度
vInitial
。以下是您将得到的结果公式:

vFinal = 9.8*m/c + (vInitial - 9.8*m/c)*exp(-c*tDelta/m);

这将是一个更准确的答案,而不是通过在时间上向前推进连续的步骤(即,当所采取的时间步骤过大时,可能会显示显著的错误或不稳定性)来近似
vFinal

递归的问题在于它会增加每次通过的函数调用开销。这将使您的代码在matlab中的速度慢得多,效率低得多。相反,使用循环,你将远远领先于其他事物。是的,在某些情况下递归是一个有价值的工具。但在许多情况下,仔细编写循环是更好的解决方案


最后,当您使用递归时,请学习何时应用诸如memoization之类的工具来改进算法的行为。记忆只是意味着不要重新计算你已经做过的事情。例如,对斐波那契序列使用递归是可能的,但这是一种非常低效的方法。

请解释您的确切意思和位置?我是在终止if语句中还是在递归调用函数的末尾执行此操作?“vi”可以替换为“velocity”(仅使用此变量)。(和“t=0:2:18”如果你想要完全相同的动作)@KronoS:这是我评论的第二部分。如果想法是让
velocity
的最终值代表给定初始速度
vi
,重力加速度和阻力对每个时间步的增量效应的总和,然后您应该在循环中将
vi
更改为
velocity
,并添加初始化
velocity=vi在进入循环之前。我会选择他的答案@Kronos,因为有一个正确的答案比“仅仅”按照书上说的去做要好。虽然我研究这个问题已经有一段时间了,但我相信编程是手头问题中更重要的方面。我找不到任何关于如何在matlab中正确执行递归的问题,我想我会用它作为一个例子。然而,这是正确的,因为这更精确。在Matlab中,循环可能更有效。