如何解决斐波那契递归值跟踪器
因此,我需要编写一个程序,该程序使用递归函数按输入参数的创建顺序存储它们的值。
例如如果我的函数是[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 举报,一经查实,本站将立刻删除。