質問: key ){ return true; } if (start > end ){ return false; } return retrieveItem(array, start+1, end, key); } ```
回答: ``` bool retItem(int arr[],int start, int end,int key) { for (; start < end; start++) { if (arr[start] == key) return true; } return false; } ``` 例示されたコードは末尾再帰って言って、ループに直せます。 コンパイラオプションを適切に設定すると、再帰じゃなくて、ただのループに最適化されます。 このコードは、array が 2 万個くらい要素があるとスタックオーバーフローで落ちます。 再帰は呼び出し位置をスタックに記録して自身を呼び出すので、8 * 20000 で 160kb か、、、、 2万くらいじゃ落ちませんね。。。。どっちにしても、再帰を使わないで実装するとコードの安全性が高まります。問題無ければループ展開した方が良いですよ。