Java ::: Desafios e Lista de Exercícios Resolvidos ::: Recursão (Recursividade)

Exercícios Resolvidos de Java - Como resolver o problema da Torre de Hanói recursivamente

Quantidade de visualizações: 2900 vezes
Pergunta/Tarefa:

Torre de Hanói, ou The Towers of Hanoi, é um "quebra-cabeça" que consiste em uma base contendo três pinos, em um dos quais são dispostos alguns discos uns sobre os outros, em ordem crescente de diâmetro, de cima para baixo. O problema consiste em passar todos os discos de um pino para outro qualquer, usando um dos pinos como auxiliar, de maneira que um disco maior nunca fique em cima de outro menor em nenhuma situação. O número de discos pode variar sendo que o mais simples contém apenas três.

A solução da Torre de Hanói (The Towers of Hanoi) pode ser feita recursivamente da seguinte forma:

O caso base (parada da recursão) é quando n = 1. Se n = 1 nós podemos simplesmente mover o disco de A para B, sem precisar passar pelo pino C. Quando n > 1 nós podemos dividir o problema original em três sub-problemas e resolvê-los sequencialmente.

1) Mova os primeiros n - 1 discos de A para C com a ajuda do pino B;
2) Mova o disco n de A para B;
3) Mova n - 1 discos do pino C para o pino B com a ajuda do pino A.

Além de resolver o problema, seu programa deverá informar quantas chamadas recursivas foram feitas. Sua saída deverá ser parecida com:



Resposta/Solução:

Veja a resolução comentada deste exercício usando Java console:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

package arquivodecodigos;

import java.util.Scanner;
 
public class Estudos {
  static int quantChamadasRecursivas = 0; // registra as chamadas recursivas  
     
  public static void main(String[] args) {
    Scanner entrada = new Scanner(System.in);
       
    // vamos ler a quantidade de discos a serem usados na simulação
    System.out.print("Informe a quantidade de discos: ");
    int discos = Integer.parseInt(entrada.nextLine());
 
    // resolve o problema recusivamente
    System.out.println("\nOs movimentos para resolver o problema foram:\n");
    moverDiscos(discos, 'A', 'B', 'C');
    System.out.println("\nForam feitas " + quantChamadasRecursivas + 
      " chamadas recursivas");
    System.out.println();
  }
   
  // método recursivo que resolve o problema da Torre de Hanói
  public static void moverDiscos(int n, char daTorre, char paraTorre, 
    char torreAux) {
    quantChamadasRecursivas++; // registra mais uma chamada recursiva
       
    if(n == 1){ // condição de parada
      System.out.println("Movendo o disco " + n + " de " + daTorre + " para " + 
        paraTorre);
    }
    else{ // faz mais uma chamada recursiva
      moverDiscos(n - 1, daTorre, torreAux, paraTorre);
      System.out.println("Movendo o disco " + n + " de " + daTorre + " para " + 
        paraTorre);
      moverDiscos(n - 1, torreAux, paraTorre, daTorre);
    }
  }
}



Ruby ::: Dicas & Truques ::: Arquivos e Diretórios

Como criar um diretório em Ruby usando a função FileUtils.mkdir()

Quantidade de visualizações: 8354 vezes
O trecho de código a seguir mostra como criar um diretório em Ruby usando o método mkdir() da classe FileUtils. Esta função recebe uma string contendo o nome e caminho do diretório a ser criado.

Veja o código Ruby completo para o exemplo:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

require "fileutils"

# nome e caminho do diretório a ser criado
diretorio = "C:\\estudos_ruby\\escola"

# cria o diretório
if FileUtils.mkdir diretorio
  puts "Diretório criado com sucesso"
else
  puts "Não foi possível criar o diretório"
end

Ao executar este código Ruby nós teremos o seguinte resultado:

Diretório criado com sucesso

Veja que, se o diretório não puder ser criado, a seguinte mensagem de erro será exibida:

C:/ruby/lib/ruby/1.8/fileutils.rb:243:in `mkdir': File 
  exists - estudos (Errno::
EEXIST)
  from C:/ruby/lib/ruby/1.8/fileutils.rb:243:in `fu_mkdir'
  from C:/ruby/lib/ruby/1.8/fileutils.rb:172:in `mkdir'
  from C:/ruby/lib/ruby/1.8/fileutils.rb:171:in `each'
  from C:/ruby/lib/ruby/1.8/fileutils.rb:171:in `mkdir'
  from estudos.rb:7



Delphi ::: Dicas & Truques ::: Bilbiotecas Estáticas (obj) e Dinâmicas (DLLs)

Apostila Delphi para iniciantes - Como criar sua primeira DLL usando Delphi

Quantidade de visualizações: 19042 vezes
Em dicas anteriores você aprendeu o que é um DLL e sua importância para a programação no ambiente Windows. Nesta dica mostrarei como criar uma DLL bem simples e usá-la a partir de um programa Delphi. Para isso siga atentamente os passos abaixo:

1) Vá em File -> New -> Other;

2) Selecione Delphi Projects e escolha DLL Wizard;

3) Neste momento o DLL Wizard criará o esqueleto do código fonte da DLL. Note que o código desta unit é bem parecido com aquele da unit de uma aplicação. A diferença principal é o uso da palavra-chave library em vez de program:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

library Project2;

{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }

uses
  SysUtils,
  Classes;

{$R *.res}

begin
end.

Salve esta unit como MinhaDLL.dproj em um diretório de sua preferência. Em seguida vamos criar uma rotina que receberá dois valores inteiros e retornará sua soma. Veja a modificação no código:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

library MinhaDLL;

function Somar(a, b: Integer): Integer; stdcall;
begin
  Result := a + b; // retorna a soma
end;

{ vamos exportar (export) a função Somar }
exports
  Somar;

begin
end.

Nossa DLL está pronta. Agora vá no menu Project -> Build MinhaDLL (ou pressione Shift+F9). Se tudo correu bem você terá um arquivo chamado MinhaDLL.dll no diretório no qual você salvou o projeto. O próximo passo é aprender a carregar esta DLL a partir de seus programas Delphi. Veja mais dicas nesta seção para aprender como isso é feito.

Para fins de compatibilidade, esta dica foi escrita usando Delphi 2009.


Portugol ::: Desafios e Lista de Exercícios Resolvidos ::: Estruturas de Controle

Exercícios Resolvidos de Portugol - Escreva um programa que leia o ano de nascimento de um rapaz e mostre a sua situação em relação ao alistamento militar

Quantidade de visualizações: 303 vezes
Pergunta/Tarefa:

Escreva um programa que leia o ano de nascimento de um rapaz e mostre a sua situação em relação ao alistamento militar.

- Se estiver antes dos 18 anos, mostre em quantos anos faltam para o alistamento.
- Se já tiver depois dos 18 anos, mostre quantos anos já se passaram do alistamento.

Sua saída deverá ser parecida com:

Informe o ano atual: 2025
Informe o ano do seu nascimento: 1980

Você tem 45 anos.
Já se passaram 27 anos do alistamento militar.

Informe o ano atual: 2025
Informe o ano do seu nascimento: 2007

Você tem 18 anos.
Você já tem idade suficiente para fazer o alistamento militar.

Informe o ano atual: 2025
Informe o ano do seu nascimento: 2009

Você tem 16 anos.
Faltam 2 anos para você fazer o alistamento militar.
Resposta/Solução:

Veja a resolução comentada deste exercício usando Portugol Web Studio:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

programa {
  funcao inicio() {
    // variáveis usadas na resolução do problema
    inteiro ano_nasc, ano_atual, idade, anos_faltam, anos_passaram
		
    // vamos pedir para o usuário informar o ano atual
    escreva("Informe o ano atual: ")
    leia(ano_atual)

    // vamos pedir para o usuário informar o ano de nascimento
    escreva("Informe o ano do seu nascimento: ")
    leia(ano_nasc)

    // vamos calcular a idade do usuário 
    idade = ano_atual - ano_nasc

    // vamos calcular os anos que faltam para o alistamento
    anos_faltam = 18 - idade

    // vamos calcular os anos que já se passaram do alistamento
    anos_passaram = idade - 18

    // vamos mostrar os resultados
    se (idade < 18) {
      escreva("\nVocê tem " + idade + " anos.")
      escreva("\nFaltam " + anos_faltam + 
        " anos para você fazer o alistamento militar.")
    }
    senao se (idade == 18) {
      escreva("\nVocê tem " + idade + " anos.")
      escreva("\nVocê já tem idade para o alistamento militar.")
    }
    senao {
      escreva("\nVocê tem " + idade + " anos.")
      escreva("\nJá se passaram " + anos_passaram +
        " anos do alistamento militar.")
    }
  }
}



Nossas 20 dicas & truques de programação mais populares

Você também poderá gostar das dicas e truques de programação abaixo

Nossas 20 dicas & truques de programação mais recentes

Últimos Projetos e Códigos Fonte Liberados Para Apoiadores do Site

Últimos Exercícios Resolvidos

E-Books em PDF

E-Book 350 Exercícios Resolvidos de Java - PDF com 500 páginas
Domine lógica de programação e a linguagem Java com o nosso E-Book 350 Exercícios Exercícios de Java, para você estudar onde e quando quiser.

Este e-book contém exercícios resolvidos abrangendo os tópicos: Java básico, matemática e estatística, programação dinâmica, strings e caracteres, entrada e saída, estruturas condicionais, vetores e matrizes, funções, laços, recursividade, internet, arquivos e diretórios, programação orientada a objetos e muito mais.
Ver Conteúdo do E-book
E-Book 650 Dicas, Truques e Exercícios Resolvidos de Python - PDF com 1.200 páginas
Domine lógica de programação e a linguagem Python com o nosso E-Book 650 Dicas, Truques e Exercícios Exercícios de Python, para você estudar onde e quando quiser.

Este e-book contém dicas, truques e exercícios resolvidos abrangendo os tópicos: Python básico, matemática e estatística, banco de dados, programação dinâmica, strings e caracteres, entrada e saída, estruturas condicionais, vetores e matrizes, funções, laços, recursividade, internet, arquivos e diretórios, programação orientada a objetos e muito mais.
Ver Conteúdo do E-book

Linguagens Mais Populares

1º lugar: Java
2º lugar: Python
3º lugar: C#
4º lugar: PHP
5º lugar: C
6º lugar: Delphi
7º lugar: JavaScript
8º lugar: C++
9º lugar: VB.NET
10º lugar: Ruby


E-Book 350 Exercícios Resolvidos de Java - PDF com 500 páginas
Domine lógica de programação e a linguagem Java com o nosso E-Book 350 Exercícios Exercícios de Java, para você estudar onde e quando quiser. Este e-book contém exercícios resolvidos abrangendo os tópicos: Java básico, matemática e estatística, programação dinâmica, strings e caracteres, entrada e saída, estruturas condicionais, vetores e matrizes, funções, laços, recursividade, internet, arquivos e diretórios, programação orientada a objetos e muito mais.
Ver Conteúdo do E-book Apenas R$ 19,90


© 2025 Arquivo de Códigos - Todos os direitos reservados
Neste momento há 95 usuários muito felizes estudando em nosso site.