{"id":27689760,"url":"https://github.com/williamkoller/recursive-node","last_synced_at":"2026-05-08T15:39:51.059Z","repository":{"id":279525431,"uuid":"939101689","full_name":"williamkoller/recursive-node","owner":"williamkoller","description":"Recursive Node","archived":false,"fork":false,"pushed_at":"2025-02-26T01:59:19.000Z","size":2,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-25T10:50:33.208Z","etag":null,"topics":["javascript","nodejs","recursive","stack","stackoverflow","typescript"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/williamkoller.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-02-26T01:51:38.000Z","updated_at":"2025-02-26T02:00:24.000Z","dependencies_parsed_at":"2025-02-26T02:36:14.971Z","dependency_job_id":"d81152c5-c39f-4db4-8698-78e42a682bb4","html_url":"https://github.com/williamkoller/recursive-node","commit_stats":null,"previous_names":["williamkoller/recursive-node"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/williamkoller/recursive-node","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/williamkoller%2Frecursive-node","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/williamkoller%2Frecursive-node/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/williamkoller%2Frecursive-node/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/williamkoller%2Frecursive-node/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/williamkoller","download_url":"https://codeload.github.com/williamkoller/recursive-node/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/williamkoller%2Frecursive-node/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261519039,"owners_count":23171228,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["javascript","nodejs","recursive","stack","stackoverflow","typescript"],"created_at":"2025-04-25T10:42:44.871Z","updated_at":"2026-05-08T15:39:46.008Z","avatar_url":"https://github.com/williamkoller.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"🚀 Recursão em TypeScript: Como Percorrer 100 Milhões de Números sem Estourar a Pilha?\n\nSe você já tentou usar recursão pura para iterar sobre um grande número de elementos em JavaScript/TypeScript, provavelmente encontrou um RangeError: Maximum call stack size exceeded. 😬\n\n🔹 O Problema\nImagine que queremos percorrer 100 milhões de números recursivamente, sem usar loops (`for`, `while`) e sem `setImmediate` ou `setTimeout`.\n\nUm código inocente como este logo trava:\n\n```javascript\nfunction iterateNumbersRecursive(num: number, limit: number): void {\n  if (num \u003e limit) return;\n  if (num % 10_000_000 === 0) console.log(`Iterate: ${num}`);\n  iterateNumbersRecursive(num + 1, limit);\n}\n\niterateNumbersRecursive(1, 100_000_000);\n```\n\nOutput:\n\n```bash\nif (num \u003e limit) return;\n  ^\n\nRangeError: Maximum call stack size exceeded\n```\n\n💥 Resultado? Maximum call stack size exceeded!\n\n🔹 Por que isso acontece?\nO JavaScript tem um limite de profundidade da pilha de chamadas, geralmente entre 10.000 e 100.000 chamadas. Isso significa que uma recursão direta, como a acima, não pode alcançar 100 milhões de chamadas sem estourar a pilha.\n\n✅ A Solução: Dividir para Conquistar (Recursão Balanceada)\nA ideia é não chamar 100 milhões de vezes em profundidade, mas sim dividir o problema em partes menores, reduzindo o número de chamadas recursivas.\n\nAqui está uma abordagem funcional que mantém a recursão pura e evita o erro de estouro de pilha:\n\n```javascript\nfunction iterateNumbersRecursive(start: number, end: number): void {\n  if (start \u003e end) return;\n\n  if (start % 10_000_000 === 0) console.log(`Iterate: ${start}`);\n\n  const mid = Math.floor((start + end) / 2);\n  \n  iterateNumbersRecursive(start + 1, mid);\n  iterateNumbersRecursive(mid + 1, end);\n}\n\niterateNumbersRecursive(1, 100_000_000);\n```\n\nOutput:\n\n```bash\nnode solution-iterate.ts \nIterate: 1000000\nIterate: 2000000\nIterate: 3000000\nIterate: 4000000\nIterate: 5000000\nIterate: 6000000\nIterate: 7000000\nIterate: 8000000\nIterate: 9000000\nIterate: 10000000\nIterate: 11000000\nIterate: 12000000\nIterate: 13000000\nIterate: 14000000\nIterate: 15000000\nIterate: 16000000\nIterate: 17000000\nIterate: 18000000\nIterate: 19000000\nIterate: 20000000\nIterate: 21000000\nIterate: 22000000\nIterate: 23000000\nIterate: 24000000\nIterate: 25000000\nIterate: 26000000\nIterate: 27000000\nIterate: 28000000\nIterate: 29000000\nIterate: 30000000\nIterate: 31000000\nIterate: 32000000\nIterate: 33000000\nIterate: 34000000\nIterate: 35000000\nIterate: 36000000\nIterate: 37000000\nIterate: 38000000\nIterate: 39000000\nIterate: 40000000\nIterate: 41000000\nIterate: 42000000\nIterate: 43000000\nIterate: 44000000\nIterate: 45000000\nIterate: 46000000\nIterate: 47000000\nIterate: 48000000\nIterate: 49000000\nIterate: 50000000\nIterate: 51000000\nIterate: 52000000\nIterate: 53000000\nIterate: 54000000\nIterate: 55000000\nIterate: 56000000\nIterate: 57000000\nIterate: 58000000\nIterate: 59000000\nIterate: 60000000\nIterate: 61000000\nIterate: 62000000\nIterate: 63000000\nIterate: 64000000\nIterate: 65000000\nIterate: 66000000\nIterate: 67000000\nIterate: 68000000\nIterate: 69000000\nIterate: 70000000\nIterate: 71000000\nIterate: 72000000\nIterate: 73000000\nIterate: 74000000\nIterate: 75000000\nIterate: 76000000\nIterate: 77000000\nIterate: 78000000\nIterate: 79000000\nIterate: 80000000\n```\n\n🧐 Como funciona?\n✔ Divide o intervalo ao invés de iterar sequencialmente, reduzindo a profundidade da recursão.\n✔ Evita o erro de stack overflow, pois a profundidade máxima da recursão será de apenas 27 chamadas (~log₂(100.000.000)) em vez de 100 milhões!\n✔ Continua sendo uma abordagem recursiva pura, sem for, while ou chamadas assíncronas.\n\n\n💡 Conclusão\nSe você precisa iterar sobre um grande número de elementos recursivamente, é essencial considerar os limites da pilha de chamadas. A abordagem de divisão recursiva permite manter a recursão sem sobrecarregar a execução.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwilliamkoller%2Frecursive-node","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwilliamkoller%2Frecursive-node","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwilliamkoller%2Frecursive-node/lists"}