、私はやや奇妙な再帰やオブジェクトを混合考えます。オブジェクトの基本概念の1つは、オブジェクトが追跡したい状態を保持していることです。再帰の基本概念の1つは、実行スタックが追跡したい状態を保持していることです。
この場合、追跡する状態は、処理された文字列の量/処理される文字列の量です。あなたはオブジェクトなしでそれを追跡することができます。
これは宿題のような匂いがします。しかし、私は答えを伝えるだけではなく、あなたに与えるヒントを考えることはできません。私ができることは、私の答えを作ることです(1)文字列に限らず、あらゆる容器を逆にすることです。 (2)STLのようなインタフェース(イテレータ)を使用する。 (3)文字列のコピーを逆順にする代わりに、文字列を逆にします。
#include <algorithm> // std::swap
// the other headers are only for my example on how to use the code
#include <iostream>
#include <iterator>
#include <string>
#include <list>
template<typename Itor> void reverse_with_recursion(Itor begin, Itor end)
{
using std::swap; // same trick used by the STL to get user-defined swap's,
// but fall back to std::swap if nothing else exists:
// http://en.wikipedia.org/wiki/Argument-dependent_name_lookup#Interfaces
// if begin and end are pointing at the same element,
// then we have an empty string and we're done
if (begin == end) {
return;
}
// the STL follows the pattern that end is one element after
// the last element; right now we want the last element
--end;
// if begin and end are pointing at the same element *now*,
// then we have a single character string and we're done
if (begin == end) {
return;
}
swap(*begin, *end);
return reverse_with_recursion(++begin, end);
}
int main()
{
std::string foo("hello world");
reverse_with_recursion(foo.begin(), foo.end());
std::cout << foo << '\n';
std::list<int> bar;
for (int i = 0; i < 10; ++i) {
bar.push_back(i);
}
reverse_with_recursion(bar.begin(), bar.end());
std::copy(bar.begin(),
bar.end(),
std::ostream_iterator<int>(std::cout, " "));
std::cout << '\n';
'gdb'でこれを実行しましたか? segfaultingはどこですか?いずれにしても、無効なメモリアクセスの可能性があります。 – RageD
呼び出しコードも表示する必要があります。 –
あなたは 'std :: reverse'を考えましたか?これは演習ですか?また、どのようにあなたの関数を呼びますか? 1つの単語でこれを1回呼び出すと、 –