コードの観点からは他の回答が適切だと思いますが、そこにたどり着く方法を理解するのに役立つ理論を追加したかっただけです。再帰を行うときは、基本ケースと再帰ケースの 2 つが常に必要です。基本ケースは解決するのが信じられないほど単純なものであり、再帰ケースは、解決可能な単純なケースに向かって作業する方法です。
Linked List は、一種の再帰的なデータ構造そのものです。たとえば、10 個のアイテムのリンク リストがある場合、9 個のアイテムのリンク リストが関連付けられた単一のノードとして描くことができます。
したがって、基本ケース(@Chrisの回答から借りる)の場合、 on を実行する最も単純なリストtoString()
は空のリストです。したがって、基本ケースは次のようになります(疑似コード):
if(list is empty)
{
return "";
}
次に、再帰ケースは、既存のリンク リストを取得し、基本ケースに向かって下向きに作業する必要があります。これを行う最も簡単な方法は、解決できることがわかっている問題の小さな部分を切り離して解決し、残ったわずかに小さな問題に取り組むことです。Linked List を印刷する場合、つまり、リストから 1 つの項目を取得し、それを文字列に変換してから、残りのリストを気にすることができます。したがって、再帰的なケースは次のようになります (疑似コード):
if(list is not empty)
{
String x = take the current node and translate it to a string;
Add x to your running value of the String value of the entire list
Recursively call this function with the next node in the list
(you reduce your list size by 1 with each call and work down to your base case of an empty list)
}
この問題を再帰的に解決する方法を理解するのに役立つことを願っています。それを機能させる方法には確かにたくさんのバリエーションがあります。ループを記述する「正しい」方法が 1 つとないように、再帰的に行う「正しい」方法は 1 つではありませんが、通常は、一般的な「基本ケース」および「再帰ケース」の考え方から始めるのが最適です。