すべての再帰関数は反復に変換できますか? 反復を使用して再帰関数を実装するには、再帰関数にどのような特性が必要ですか?
反復を使用して次の関数を定義しようとしましたが、うまくいかないようです! 迷路内のすべてのパス (ノード) を探索することになっています。誰でも反復を使用してこれを書き直すことができますか? それが不可能な場合、それはなぜですか?
typedef int[0,99] id_t;
bool visited[id_t];
int path[id_t];
int pathCounter = 0;
struct {
id_t id;
bool free;
int neighborNode[4];
} nodeMap[id_t];
void findPath(int current){
visited[current] = true;
for (i : int[0, 3]){
if(nodeMap[nodeMap[current].neighborNode[i]].free == true && visited[nodeMap[current].neighborNode[i]] == false && nodeMap[current].neighborNode[i] != -1){
path[pathCounter] = nodeMap[nodeMap[current].neighborNode[i]].id;
pathCounter++;
findPath(nodeMap[current].neighborNode[i]);
path[pathCounter] = nodeMap[current].id;
pathCounter++;
}
}
path[0] = current;
}
拡張機能: 独自のスタックを実装せずに、前述の再帰関数を反復に変換することは可能ですか? 答えの 1 つは、スタック構造を使用せずにすべての末尾再帰関数を反復に変換できることを示唆していました...そうであれば、すべての再帰関数は末尾再帰に変換できますか? どのように?