2015-03-20 2 views
2

Я пытаюсь отслеживать, сколько раз функция вызывает себя. Я попытался установить num как 0 и положить num = num + 1 в конце, но я продолжаю получать 1. Как это исправить?Как отслеживать рекурсивный вызов моей функции collatz?

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 

спасибо.

ответ

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 
0

Когда вы рекурсивно звоните collatz, вы должны также сэкономить num.

[out,num] = collatz(val/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, я получаю:

Смежные вопросы