Communities

Writing
Writing
Codidact Meta
Codidact Meta
The Great Outdoors
The Great Outdoors
Photography & Video
Photography & Video
Scientific Speculation
Scientific Speculation
Cooking
Cooking
Electrical Engineering
Electrical Engineering
Judaism
Judaism
Languages & Linguistics
Languages & Linguistics
Software Development
Software Development
Mathematics
Mathematics
Christianity
Christianity
Code Golf
Code Golf
Music
Music
Physics
Physics
Linux Systems
Linux Systems
Power Users
Power Users
Tabletop RPGs
Tabletop RPGs
Community Proposals
Community Proposals
tag:snake search within a tag
answers:0 unanswered questions
user:xxxx search by author id
score:0.5 posts with 0.5+ score
"snake oil" exact phrase
votes:4 posts with 4+ votes
created:<1w created < 1 week ago
post_type:xxxx type of post
Search help
Notifications
Mark all as read See all your notifications »
Q&A

Welcome to Software Development on Codidact!

Will you help us build our independent community of developers helping developers? We're small and trying to grow. We welcome questions about all aspects of software development, from design to code to QA and more. Got questions? Got answers? Got code you'd like someone to review? Please join us.

Post History

77%
+5 −0
Q&A Recursion without a procedure ("function") in JavaScript

Yes, it's possible. In a more general way, every recursive algorithm can be converted to an iterative one (and vice-versa). You just need to use a stack. Internally, a recursive function will use...

posted 2y ago by hkotsubo‭

Answer
#1: Initial revision by user avatar hkotsubo‭ · 2022-04-28T14:48:08Z (almost 2 years ago)
Yes, it's possible.

In a more general way, every recursive algorithm can be converted to an iterative one (and vice-versa).

You just need to use a [stack](https://en.wikipedia.org/wiki/Stack_(abstract_data_type)). Internally, a recursive function will use a stack to "remember" its "level" (because each recursive call is like entering a new "level" - just like dream levels in [Inception](https://en.wikipedia.org/wiki/Inception)).

To use an iterative algorithm, you must use the stack yourself. In JavaScript, we can use a simple array for that:

```javascript
function replaceIn(e) {
    // stack (actually an array) starts with element "e" in it
    var stack = [ e ];

    while (stack.length > 0) {
        // get stack's top
        var currentElement = stack.pop();
        if (currentElement.nodeType == Node.TEXT_NODE) {
            currentElement.nodeValue = currentElement.nodeValue.replaceAll("a", "");
        }
        // add all child nodes to the stack
        for (const child of currentElement.childNodes) {
            stack.push(child);
        }
    }
}
```

Let's say you call `replaceIn(document.body)`. The stack starts with `document.body` in it. Then I check if it's a text node and call `replace`.

After that, I add all child nodes of `document.body` to the stack. In the next iteration, the stack's top will be one of those nodes. Then I check if it's a text node, `replace` and add its child nodes to the stack. And so on.

The result will be the same: in the end, all the child nodes, and the grandchild nodes, and grand-grandchild nodes, etc, will be added to the stack. When there are no more child nodes to be added, the loop will finish processing all of them (and remove them from the stack, because that's what `pop` does), until the stack is empty.

---

> As a side note, for this particular case, I find the recursive algorithm more intuitive, because it's dealing with a hierarchical tree-like structure, which is recursive by definition.