我正在使用Matlab R2018a。它具有一个“记忆”功能,该功能可以在顶层使用,但是我看不到如何将其用于递归功能。 例如,我尝试过这样:
function z = recfib(n)
if n == 1
z = 1;
else
z = memfib(n-1)+memfib(n-2);
end
fprintf('computed f(%d)=%d',n,z);
end
然后
memfib = memoize(@recfib);
但这不起作用,因为调用memfib或recfib会产生错误:
未定义的函数或变量'memfib'。
答案 0 :(得分:3)
您需要将memfib
粘贴在函数内的调用可以看到的位置。如果仅在命令行或调用代码中执行memfib = memoize(@recfib)
,则最终在基址/调用者工作区中会产生一个memfib
变量,而不是全局可见的memfib
函数。>
我认为您可以使用recfib
函数中的持久变量来执行此操作。这在R2019b中对我有效。
function z = recfib(n)
persistent memfib
if isempty(memfib)
memfib = memoize(@recfib);
end
if n <= 1
z = 1;
else
z = memfib(n-1)+memfib(n-2);
end
fprintf('computed f(%d)=%d\n',n,z);
end
运行两次显示该备忘录正在发生:
>> recfib(8)
computed f(1)=1
computed f(0)=1
computed f(2)=2
computed f(3)=3
computed f(4)=5
computed f(5)=8
computed f(6)=13
computed f(7)=21
computed f(8)=34
ans =
34
>> recfib(8)
computed f(8)=34
ans =
34
>>
(此外,您在基本案例测试中遇到了一个错误;要捕获0和-1个案例,它必须是n <= 1
,而不是n == 1
,因为那个{{1} }行在n = 2时最终调用memfib(n-2)
。)