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 = 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ように使用できます。これを行って 5 でnum呼び出すと、次のようになります。collatz

[out,num] = collatz(5)

out = 

    1

num = 

    6
于 2015-04-12T03:31:16.137 に答える