Skip to content

Recursion and stack - #485

Open
diogoosz wants to merge 1 commit into
javascript-tutorial:masterfrom
diogoosz:translate-recursion
Open

diogoosz wants to merge 1 commit into
javascript-tutorial:masterfrom
diogoosz:translate-recursion

Conversation

@diogoosz

@diogoosz diogoosz commented Nov 9, 2026

Copy link
Copy Markdown
Contributor

Tradução do artigo "Recursion and stack" para o português, incluindo os exercícios e a imagem recursion-pow.svg.

Conforme comentado na #1.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Árvores como a árvore de elementos HTML ou a árvore de departamentos deste capítulo também são naturalmente recursivas: elas têm ramificações, e cada ramificação pode ter outras ramificações.

Recursive functions can be used to walk them as we've seen in the `sumSalary` example.
Funções recursivas podem ser usadas para percorrê-las, como vimos no exemplo do `sumSalary`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

O texto cita sumSalary, mas a função definida no artigo é sumSalaries. Quem procurar o nome citado não vai achar a função. Sugestão: "como vimos no exemplo do sumSalaries." (o erro já existe no original em inglês; vale corrigir aqui).

---

# Output a single-linked list
# Exiba uma lista encadeada simples

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Terminologia inconsistente: o artigo traduz "linked list" como "lista ligada", mas as tarefas 04 e 05 usam "lista encadeada simples". A linha 7 diz "como descrito no capítulo info:recursion", só que o capítulo nunca usa "encadeada". Sugiro escolher um único termo nos 3 arquivos (por exemplo, "lista ligada simples").

---

# Sum all numbers till the given one
# Some todos os números até o dado

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Título ambíguo: "até o dado" pode ser lido como o substantivo "dado" (de jogar). Sugestão: "# Some todos os números até o número dado".

</ul>

That's when the function starts to execute. The condition `n == 1` is falsy, so the flow continues into the second branch of `if`:
É quando a função começa a executar. A condição `n == 1` é falsa, então o fluxo continua para segunda ramificação do `if`:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Falta o artigo: "continua para segunda ramificação" deveria ser "continua para a segunda ramificação".

1. Either it's a "simple" department with an *array* of people -- then we can sum the salaries in a simple loop.
2. Or it's *an object* with `N` subdepartments -- then we can make `N` recursive calls to get the sum for each of the subdeps and combine the results.
1. Ou é um departamento "simples", com um *array* de pessoas -- então podemos somar os salários num laço simples.
2. Ou é *um objeto* com `N` subdepartamentos -- então podemos fazer `N` chamadas recursivas para obter a soma de cada um dos subdeps e combinar os resultados.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"subdeps" ficou como abreviação em inglês no meio do texto em português. Sugestão: "cada um dos subdepartamentos".

A lógica recursiva aqui é um pouco mais complicada.

We need to first output the rest of the list and *then* output the current one:
Primeiro precisamos exibir o resto da lista e *depois* exibir a atual:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Concordância: "exibir a atual" se refere ao item/elemento atual (masculino), não à lista. Sugestão: "exibir o atual" (ou "exibir o elemento atual").

A variante com laço é a segunda em termos de velocidade. Tanto na variante recursiva quanto na de laço, somamos os mesmos números. Mas a recursão envolve chamadas aninhadas e gerenciamento da pilha de execução. Isso também consome recursos, então é mais lenta.

P.P.S. Some engines support the "tail call" optimization: if a recursive call is the very last one in the function, with no other calculations performed, then the outer function will not need to resume the execution, so the engine doesn't need to remember its execution context. That removes the burden on memory. But if the JavaScript engine does not support tail call optimization (most of them don't), there will be an error: maximum stack size exceeded, because there's usually a limitation on the total stack size.
P.P.S. Alguns motores suportam a otimização de "chamada de cauda" (*tail call*): se uma chamada recursiva é a última da função, sem nenhum outro cálculo realizado depois, então a função externa não vai precisar retomar a execução, então o motor não precisa lembrar seu contexto de execução. Isso remove a sobrecarga na memória. Mas, se o motor do JavaScript não suportar a otimização de chamada de cauda (a maioria não suporta), vai haver um erro: tamanho máximo da pilha excedido, porque normalmente existe uma limitação no tamanho total da pilha.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A frase repete "então" duas vezes ("...não vai precisar retomar a execução, então o motor..."), o que dificulta a leitura. Sugestão: "...não vai precisar retomar a execução e, portanto, o motor não precisa lembrar seu contexto de execução."

A principal desvantagem é que não conseguimos acessar facilmente um elemento pelo seu número. Num array isso é fácil: `arr[n]` é uma referência direta. Mas na lista precisamos começar do primeiro item e seguir `next` `N` vezes para chegar ao N-ésimo elemento.

...But we don't always need such operations. For instance, when we need a queue or even a [deque](https://en.wikipedia.org/wiki/Double-ended_queue) -- the ordered structure that must allow very fast adding/removing elements from both ends, but access to its middle is not needed.
...Mas nem sempre precisamos desse tipo de operação. Por exemplo, quando precisamos de uma fila ou até de um [deque](https://pt.wikipedia.org/wiki/Deque_(estruturas_de_dados)) -- a estrutura ordenada que precisa permitir adicionar/remover elementos muito rapidamente dos dois lados, mas o acesso ao meio não é necessário.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A URL do link tem parênteses sem escape (Deque_(estruturas_de_dados)). Alguns renderizadores de Markdown fecham o link no primeiro ) e deixam ) solto no texto. É mais seguro codificar: https://pt.wikipedia.org/wiki/Deque_%28estruturas_de_dados%29.

Quando uma função chama a si mesma, isso é chamado de *passo de recursão*. A *base* da recursão são os argumentos da função que tornam a tarefa tão simples que a função não faz mais chamadas.

- A [recursively-defined](https://en.wikipedia.org/wiki/Recursive_data_type) data structure is a data structure that can be defined using itself.
- Uma estrutura de dados [definida recursivamente](https://en.wikipedia.org/wiki/Recursive_data_type) é uma estrutura de dados que pode ser definida usando a si mesma.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Este é o único link da Wikipédia que continua apontando para en.wikipedia; os outros foram trocados para pt.wikipedia. Vale trocar se houver uma página equivalente em português; se não houver, dá para manter e avisar que o conteúdo está em inglês.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants