2016-08-09 26 views
1

関数が再帰的である場合、最初の再帰だけで行を実行するにはどうすればよいですか?私は、すべての再帰で行を実行する必要はありません。あなたはこのようなものになるだろうので再帰関数で行を1回実行する

+1

通常、何か_conditionally_を実行するには、 'if'キーワードを使用する_conditional statement_を使用します。何があなたにはっきりしていませんか? –

+1

私はそれが完全で有効で面白い質問だと思います。なぜ否定的な投票ですか?問題へのアプローチ方法には2つの良い答えがあります。 –

+0

@SembeiNorimaki私は(それは私ではなかった)downvoteはそのような問題についてではなく、彼が実際に例を挙げなかったと思っています。 –

答えて

2

は、私はおそらく、このためのラッパー関数を記述します。ビット拡張性を向上させる必要があります

function do_stuff() { 
    do_stuff_only_once() 
    do_recursive_stuff() 
} 

function do_recursive_stuff() { 
    do_base_stuff() 
    do_recursive_stuff() 
} 

この方法であなたはすべての単一の関数呼び出しでifステートメントを行っていません、 。

0
function recursiveFunction(tempValue) { 

    if(tempValue==1) { 
    //exceute code one line code 
    } 
    // other function code here 
    recursiveFunction(tempValue++) 
} 


/*Call function */ 

recursiveFunction(1) 
+0

関数を呼び出すたびにインクリメントする必要はありません。ちょうどそれを何かに設定し、それを使ってやってください。いくつかの計算を保存してください。 –

+0

はい、私はそれを知っています、私はそれを最初の呼び出しを区別するために置く –

0

dbstackを使用できます。私が以下のような関数を持っている場合

function tmp(iter) 
    x = dbstack; 
    disp(length(x)); 
    if iter < 10 
     tmp(iter+1) 
    end 

私はそれを何番目の関数が深い関数であるかを表示します。問題は、多くの場所でそれを使用したい場合、dbstackの長さでは十分ではないということです。その場合、dbstack構造体の名前フィールドを使用する必要があります。

永続的な変数は、関数への複数の呼び出しのためにその値を保持:私は一度だけ何かしたい場合は、それは別のオプションは、永続的な変数を使用することです。この

function tmp(iter) 
    %get the function list 
    x = dbstack; 
    %convert the function names into a cell array 
    func_names = {x.name}; 
    %create a logical array of which functions match the name 
    name_matches = strcmp(func_names,'tmp'); 
    %if there's only one match, we do it 
    if sum(name_matches) <= 1 
     disp('ONCE!'); 
    end 
    disp('EVERY TIME!'); 
    if iter < 10 %make a few recursive calls to demonstrate the function 
     tmp(iter + 1); 
    end 
0

のように見えると思います。これは、初期化する値がある場合に理想的です。

関連する問題