2

我试图跟踪函数调用本身的次数。我尝试将 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

谢谢你。

4

3 回答 3

2

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

  • 在您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
于 2015-03-20T12:50:57.180 回答
0

当您递归调用时collatz,您也应该保存num

[out,num] = collatz(val/2);
于 2015-03-20T03:32:08.160 回答
0

您还可以global通过更改递归调用来避免使用声明,collatz以便它们也输出num。您还需要更改基本情况,以便num = 0val = 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
于 2015-04-12T03:31:16.137 回答