递归二叉树代码,不能超过5步......为什么?

时间:2012-11-18 21:03:35

标签: matlab recursion options binomial-heap

function [y]=AmericanPutClassic (St,t)
% S0 = 100;
K = 100;
r = 0.05;
sigma = 0.3;
T = 2;
nsteps = 5;
% St
dt = T / nsteps;
u=exp(sigma*sqrt(dt));
d=1/u;

Pu=(exp(r*dt)-d)/(u-d);
Pd=1-Pu;

if t==T
    y=max(K-St,0);
    return
elseif t<T
    upPrice=AmericanPutClassic(St*u,t+dt);
    downPrice=AmericanPutClassic(St*d,t+dt);
    PrevPrice=(Pu*upPrice+Pd*downPrice)*exp(-r*dt);
    if max(K-St,0) > PrevPrice
        y=max(K-St,0);
    else 
        y=PrevPrice;
    end
    return
end
end

我认为我的代码完成了这项工作,但是当我使'nsteps'高于5时,它就会崩溃......我不断得到不同的错误......现在它只是说我的代码有高于5的问题......之前它会说: “???达到的最大递归限制为500.使用set(0,'RecursionLimit',N) 改变限制。请注意,超出可用堆栈空间可以 崩溃MATLAB和/或您的计算机。“

有人能发现问题吗? 我首先打电话给AmericanPutClassic(100,0)......

由于

1 个答案:

答案 0 :(得分:2)

我不知道你要做什么,但是这个问题已经被描述了很多次,所以它不再有趣了。

让我们画一幅画:

你从

开始
dt = T / nsteps;

这是我的第一个红旗。

然后你做:

if t==T

其中t = t + dt

为什么这是错的?因为这个奇妙的东西叫量化。换句话说,有一段时间由于超小的微差异,结果将是不正确的。更大的步骤,这将是更糟糕的。

然后再加上侮辱伤害,你把这一行放在

elseif t<T ... end

这意味着您的代码将跳过所有内容,并且您将不会返回任何内容,从而导致代码崩溃。

如何解决这个问题?如果你可以移动整数而不是浮动值,你将处于更好的位置。因此,您可以使用currentStep代替dt,这样:

function [y]=AmericanPutClassic (St, currentStep)
if nargin < 2
    currentStep = 0;
end
...
if currentStep>=nsteps % if t==T
...
else
...
    upPrice=AmericanPutClassic(St*u,currentStep+1);
...
end