如何在Matlab中记忆递归函数

时间:2019-12-06 18:04:31

标签: matlab

我正在使用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'。

1 个答案:

答案 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)。)