【问题标题】:Fibonacci Recursion Value tracer斐波那契递归值跟踪器
【发布时间】:2020-12-12 18:01:51
【问题描述】:

所以我需要编写一个程序,它使用递归函数按输入参数的生成顺序存储输入参数的值。

例如如果我的函数是 [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 是斐波那契数列中的第 6 个元素。

这是我的代码

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 中,而不是整个值集。

【问题讨论】:

    标签: matlab fibonacci persistent


    【解决方案1】:

    首先,请注意您的输入 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) 会增加计算时间。

    【讨论】:

      猜你喜欢
      • 2010-12-03
      • 1970-01-01
      • 1970-01-01
      • 2014-04-02
      • 2017-11-18
      • 2014-01-08
      • 2011-12-14
      • 2012-11-29
      相关资源
      最近更新 更多