如何跟踪我的函数 collatz 的递归调用?
How to keep track of recursive call on my function 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
谢谢。
当你递归调用collatz
时你应该将num
保存到.
[out,num] = collatz(val/2);
一种可能的方法是使用global variable 来计算调用次数。您需要将该变量声明为 global
- 在您第一次调用
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
您还可以通过更改 collatz
中的递归调用来避免使用 global
声明,以便它们也输出 num
。您还需要更改基本情况,以便在 val = 1
时 num = 0
。因此,改为这样做:
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
。当我这样做并用 5 调用 collatz
时,我得到:
[out,num] = collatz(5)
out =
1
num =
6
我正在尝试跟踪函数调用自身的次数。我已尝试将 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
谢谢。
当你递归调用collatz
时你应该将num
保存到.
[out,num] = collatz(val/2);
一种可能的方法是使用global variable 来计算调用次数。您需要将该变量声明为 global
- 在您第一次调用
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
您还可以通过更改 collatz
中的递归调用来避免使用 global
声明,以便它们也输出 num
。您还需要更改基本情况,以便在 val = 1
时 num = 0
。因此,改为这样做:
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
。当我这样做并用 5 调用 collatz
时,我得到:
[out,num] = collatz(5)
out =
1
num =
6