微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

斐波那契递归值跟踪器

如何解决斐波那契递归值跟踪器

因此,我需要编写一个程序,该程序使用递归函数按输入参数的创建顺序存储它们的值。

例如如果我的函数[f trace]=fibo_trace(6,[]),它将返回

[f trace]=fibo_trace(6,[])
f=
    8
trace=
    6     4     2     3     1     2     5     3     1     2     4     2     3     1     2

其中trace是用来初始化递归调用的值,而f斐波那契数列中的第六个元素。

这是我的代码

function [f,trace] = fibo_trace(n,v)
    
    persistent ptrace;   % must specify persistent
   
    v=n; 
    ptrace=cat(2,ptrace,v);
   
    
    if n <= 2
        f = 1;
    else
        f = fibo_trace(n-2) + fibo_trace(n-1);
    end
    trace=ptrace;
end

但是,如果测试了多个条件,则使用持久变量将无法提供正确的输出。我需要在不使用持久变量或全局变量的情况下进行计算,有人可以在这里帮助我吗?

当我不使用持久变量时,n的最新值将存储在向量v中,而不是整个值集。

解决方法

首先,请注意,您从未使用过输入v,而总是用n覆盖它。

接下来,请注意,您对fibo_trace(n-1)(n-2)的呼叫可能返回trace,而您只是选择不这样做。我们可以利用第二个输出来构建trace数组。

这两点意味着您可以摆脱持久变量,并稍微简化代码。我们只需要对前两个迭代分别调用fibo_trace

function [f,trace] = fibo_trace(n)     
    if n <= 2
        % The trace should just be 'n' for the starting elements f=1
        f = 1;
        trace = n;
    else
        % Get previous values and their traces
        [f1,t1] = fibo_trace(n-1);
        [f2,t2] = fibo_trace(n-2);
        % Compute the outputs
        f = f1 + f2;
        trace = [n,t2,t1];
    end
end

结果:

[f,trace] = fibo_trace(6)
f =
     8
trace =
     6     4     2     3     1     2     5     3     1     2     4     2     3     1     2

这里需要进行一些优化,因为fibo_trace(n-1)本身将调用fibo_trace(n-1),因此单独计算fibo_trace(n-2)会增加计算时间。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。