如何跟踪我的函数collat​​z上的递归调用?

时间:2015-03-20 02:31:04

标签: matlab recursion collatz

我试图跟踪函数调用自身的次数。我已经尝试将num设置为0并将num = num + 1放在最后,但我一直得到1.如何解决这个问题?

function [out num] = collatz(val)
num = 0;
if val == 1
   out = 1;
elseif mod(val, 2) == 0
   out = collatz(val/2);
else 
   out = collatz(3*val+1);
end
num = num+1;
end

谢谢。

3 个答案:

答案 0 :(得分:2)

一种可能的方法是使用global variable来计算呼叫次数。您需要将该变量声明为全局

  • 在您第一次调用collatz的工作空间中;和
  • 在函数内。

因此该函数定义为:

function out = collatz(val)
global num %// declare as global within the function
num = num+1; %// increase call counter
if val == 1
   out = 1;
elseif mod(val, 2) == 0
   out = collatz(val/2);
else 
   out = collatz(3*val+1);
end
end

然后,从命令行:

>> clear all
>> global num %// declare as global in workspace
>> num = 0; %// initiallize to 0
>> collatz(5)
ans =
     1
>> num %// see value of num
num =
     6

答案 1 :(得分:0)

当您递归拨打collatz时,您也应该保存num

[out,num] = collatz(val/2);

答案 2 :(得分:0)

您还可以通过更改global中的递归调用来避免使用collatz声明,以便它们也输出num。您还需要更改基本案例,以便在num = 0时更改val = 1。因此,请改为:

function [out,num] = collatz(val)
if val == 1
   out = 1;
   num = 0; %// Change
elseif mod(val, 2) == 0
   [out,num] = collatz(val/2);  %// Change
else 
   [out,num] = collatz(3*val+1); %// Change
end
num = num+1;
end

然后,您可以使用collatz,以便在命令提示符中调用num时输出collatz。当我这样做,并用5调用[out,num] = collatz(5) out = 1 num = 6 时,我得到:

{{1}}