Mostrando entradas con la etiqueta C#. Mostrar todas las entradas
Mostrando entradas con la etiqueta C#. Mostrar todas las entradas

martes, 8 de mayo de 2012

Recursividad



Hola a todos,

En este caso veremos algo llamado recursividad y lo aplicaremos a la resolución de un problemita.

Para comenzar, que es recursividad?

Bueno, para mí  un algoritmo de recursividad, es un algoritmo que busca la solución de un problema determinado haciendo o realizando llamados así mismo.

Para ejemplificar, diremos que es un pedazo de código muy pequeño que puede resolver problemas muy grandes llamándose así mismo una cantidad de veces determinadas que se pueden o no especificar.

Pero, para implementarlo hay que tener encuentra varias cositas:
  • ·         Es necesario que el método que aremos recursivo tenga una salida. Ya que podría caer en un llamado infinito y consumir los recursos de máquina.
  • ·         Estos algoritmos no ayudan a superar problemas con pedazos de código pequeños.
  • ·         Hay que tener en cuenta que entre más lejos este la solución (Entre mas llamados así mismo) el método se puede volver mas y mas lento.
El ejemplo que aremos, será uno muy común que es el de buscar el factorial de un numero,Pero de manera recursiva, sin ciclos ni nada por el estilo. Solo haciendo llamados asi mismo.

·         El programa consistirá en 3 métodos y 2 variables globales.

  • ·         Un método, que será el principal main();
  • ·         Un método que toma  y muestre los valores necesarios llamado sacarFactorial();
  • ·         Y el ultimo que será el método recursivo, y tendrá como parámetro el numero que multiplicaremos y se ira decrementando.

  • ·         Y las dos variables que serán uno para llevar el conteo y será el que da la salida del método.
  • ·         Otra variable que ira almacenando el valor calculado en cada caso.



//
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


//Este programa tiene como limite el definido por los tipos de datos primitivos
//por lo cual si quieres implementarlos para un muero indeterminado de digitos tendran que tener encuenta
namespace Recursividad
{
    class Program
    {
        private static int cont;
        private static long numero;

        static void Main(string[] args)
        {
            sacarFactorial();
        }
        
        /**
         * En este metodo sera el que pida el valor al cual se le quiera sacar el factorial
         * y llamara al etodo recursivo
         **/
        public static void sacarFactorial()
        {
            Console.WriteLine("Digite el numero que desea sacar el Factorial");
            numero = Convert.ToInt16(Console.ReadLine());
            cont = (int)numero-1;

            numero=calcularFactorial(cont);
            Console.WriteLine("El Factorial es "+numero);
            Console.ReadKey();
        }

        /**
         * Este sera el metodo Recursivo. El cual multipplicara una variable global llamada numero
         * por el valor que se le pase por parametro. Este sera el valor que iremos decrmentando
         * y cuando sea igual a 0 entonces retonara el valor final calculado, por lo cual usamos una variable global
         **/
        public static long calcularFactorial(int fact)
        {
            numero *= fact;
            cont--;
            if(cont >0)
            {
                calcularFactorial(cont); 
            }
                        
            return numero;
        }

    }
}



martes, 17 de enero de 2012

Numeros Primos en C#

Bueno ahora vamos hacer algo muy común, Normalmente este es un ejercicio de programación que nos ayuda a comprender mejor la lógica de los problemas y comúnmente usado por los profesores, para tal enseñanza me refiero a calcular si un numero es primo o no?.

Hoy vamos hacer el programa para ver si un número ingresado por consola es primo o no.

Primero definamos el concepto de número primo:

Un numero primo es aquel numero que solo es divisible por 1 y pos si mismo, de lo contrario este número solo será un múltiplo de otro.

También cabe recordar que los números primos son Enteros y los decimales no entran en esta categoría.

Si quieres tener un mejor concepto de esto pueden ver en Wiki Numeros Primos.

Ahora en C# voy hacer  tres metodos los cuales van hacer lo mismo (Ver si el numero es primo o no), pero cada metodo va hacer mejor que el siguiente y mejor me refiero a mas optimo, bueno a qui les dejo el codigo si tienen alguna duda me comentan...=)

    class Program
    {
        
        static void Main(string[] args)
        {
            //pedimos el numero por parametro
            Console.WriteLine("Escriba el numero a identificar si es primo o no");

       //creamos la variable, convertimos el parámetro a entero ya que todo dato q pedimos entra como string

            int aux= Convert.ToInt32(Console.ReadLine());
        
  //llamamos el método que optimizamos
            verPrimo1(aux);
            verPrimo2(aux);
            verPrimo3(aux);

            Console.ReadKey();
        }

        //Este el método normal, solo veremos  hay algún numero mayor a 1 y menor q si mismo que al aplicarle el modulo "%" 
         // o si el residuo de la división es cero, esto significara que es un múltiplo de otro número y por lo tanto no es primo
         // Si con el primero no coincide ira incrementado de 1 en 1 hasta llegar a  si mismo -1
         


        public static void verPrimo1(int num) 
        {
            //una variable que identifica cuando es primo
            bool primo = false;

            //el dos es considerado como primo, por lo cual si es 2 no tendremos la necesidades meterlo en el ciclo

            if (num != 2)
            {

                //vamos hacer un ciclo, para tratar de dividir por todos los numero y determinar si es primo
                for (int i = 2; i < num; i++)
                {
                    if (num % i == 0)
                    {
                        primo = true;
                        Console.WriteLine("El numero No es primo");
                        break;
                    }
                }

            }
            //verificamos la variable en caso tal que haya recorrido y no encuentre ninguno entonces es primo
            if (!primo)
            {
                Console.WriteLine("El numero es primo");
            }
        }


        /*lo que se hará en este método es verificar si el número es primo, Pero optimizando la manera en cómo se busca
        *Si observamos el código anterior nos damos cuenta que se tiene que de 1 en 1 hasta encontrar el indicado en este método vamos a variar
        *ahora vamos a ir solo hasta la mitad del número, debido  a que por lógica la mitad superior es múltiplo de la mitad inferior
        * si solo comparamos con la mitad inferior mas 1 sería más que suficiente.*/

        public static void verPrimo2(int num)
        {
            bool primo = false;

            if (num != 2)
            {

                //vamos hacer un ciclo, para tratar de dividir por todos los numero y determinar si es primo
                for (int i = 2; i < (num/2)+1 ; i++)
                {
                    if (num % i == 0)
                    {
                        primo = true;
                        Console.WriteLine("El numero No es primo");
                        break;
                    }
                }

            }
            //verificamos la variable en caso tal que haya recorrido y no encuentre ninguno entonces es primo

            if (!primo)
            {
                Console.WriteLine("El numero es primo");
            }

        }

        //lo que aremos en esta optimización es debido a q todos los números Primos son impares entonces ya no tendremos que ir de 1 en 1
        // aremos solo q divida entre impares empezando en 1  pero sin tener efecto e ir incrementándolo de dos en dos


        public static void verPrimo3(int num)
        {
            bool primo = false;

            if (num != 2)
            {

                //vamos hacer un ciclo, para tratar de dividir por todos los numero y determinar si es primo
                for (int i = 1; i < (num / 2) + 1; i=i+2)
                {
                    if (i != 1)
                    {
                      if (num % i == 0)
                         {
                             primo = true;
                             Console.WriteLine("El numero No es primo");
                             break;
                         }
                    }
                }

            }
            //verificamos la variable en caso tal que halla recorrido y no encuentre ninguno entonces es primo
            if (!primo)
            {
                Console.WriteLine("El numero es primo");
            }

        }
    }