2016-12-08 6 views
0

私はプログラミングがとても新しく、このコードが自らを呼び出すので再帰と見なすことができるかどうかを知りたいと思っています。これが良い習慣であるかどうかも知りたいです。これは再帰と見なされますか?

void editArr(int arr[], int arrSize){ 
int index; 

cout << "Enter INDEX: "; 
cin >> index; 

if(index >= arrSize){ 
    cout << "INDEX is OUT OF BOUNDS" << endl; 
    editArr(arr, arrSize); 
} 

cout << "Enter VALUE: "; 
cin >> arr[index]; 

cout << "\n[1] Continue || [0] Exit"; 
cin >> choiceExit; 
if(choiceExit == 1) 
    editArr(arr, arrSize); 

} 
+6

それ自体を呼び出す関数は、再帰の定義です。 –

+0

「良い練習」であるかどうかは、依存しています。この場合、関数は "continue/exit"の選択肢のループの代わりに再帰を使用しているようです。再帰の具体的な例は私が言うことです*悪い*練習です。 –

+0

Wikiquote:コンピュータサイエンスの再帰は、問題の解決策が同じ問題の小規模なインスタンスの解決法に依存する方法です([iteration](https://en.wikipedia.org/wiki/Iteration)とは対照的です)( [src](https://en.wikipedia.org/wiki/Recursion_%28computer_science%29)) – Drop

答えて

1

私はプログラミングに非常に新しいですし、それが自分自身を呼び出すので、このコードはまた、再帰考えることができるかどうかを知りたいと思います。

はい、その通りです。再帰が定義されています。関数は、それ自体を直接的または間接的に呼び出します。

また、これが良い方法であるかどうかを知りたいと思います。

一般的には、そのコードをループで置き換え、スタックを使用する方がよい(例:std::stack)。あなたの場合でも、単純なループでもうまく動作します。

再帰呼び出しは、(制限された)本質的な呼び出しスタックサイズに依存し、呼び出しスタックをオーバーフローする傾向があります。

1

この関数は、自身を呼び出します。再帰的です。

このプログラムでは、ユーザーが続行を選択するたびに新しいスタックフレームが割り当てられます。これは無期限に発生する可能性があるため、ここでループを選択するとよいでしょう。

この関数はtail recursiveです(ただし、OOBインデックスが指定されている場合を除き、すべてがうまくブレークしません)ので、コンパイラは余分なスタックフレームの割り当てを最適化する可能性がありますが、個人的にはそれに依存しません。

+0

"この関数はテール再帰的です"。モジュロバグ。 –

0

うまくいくようです。関数の先頭にchoiceExitを整数として定義することを忘れないでください。配列を初期化する通常の方法ではないことに注意してください。再帰は少し重いです。また、Arraysizeをパラメータとして指定する必要はありませんが、size(Arr)はそれを与えてくれます。 whileループは確かにずっと良いでしょう。 ChoiceExitは2つの "ケース"しかないので、途中でブール値になる可能性があります。

+0

"それはうまくいくようです。" 「仕事」の定義について"サイズ(Arr)はそれを与える"。あんまり。 –

+0

@ n.m。 sizeofはうまくいくはずですか? –

+0

いいえ、動作しません。 –

関連する問題