elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Calcular longitud de cadena C++ (punteros)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: Calcular longitud de cadena C++ (punteros)  (Leído 20,611 veces)
Bob1098

Desconectado Desconectado

Mensajes: 87


Ver Perfil
Re: Calcular longitud de cadena C++ (punteros)
« Respuesta #10 en: 18 Septiembre 2014, 16:40 pm »

¡Buenas!

Esta función es muy sencilla también:
Código
  1. int longitud(char *s)
  2. {
  3.    if(!(*s))
  4.        return 0;
  5.  
  6.    return 1 + longitud(s + 1);
  7. }
  8.  

¡Saludos!

PD: o con un cuerpo de una sola línea: XD
Código
  1. int longitud(char *s)
  2. {
  3.    return (*s) ? 1 + longitud(s + 1) : 0;
  4. }
  5.  

Impresionante, ahora me entero que puedes devolver la función en si jaja. Eso si que es optimizar un código.

Gracias, y un saludo.


En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Calcular longitud de cadena C++ (punteros)
« Respuesta #11 en: 18 Septiembre 2014, 17:14 pm »

Eso si que es optimizar un código.

Depende del baremo en que te bases a la hora de definir una optimización:

* Si para ti optimizar es reducir el código de la función, perfecto, esta función es más óptima.
* Si optimizar es sinónimo de velocidad, has de saber que una función recursiva es más lenta que un bucle. Además la recursividad, a diferencia de los bucles, tiene un límite dado por la pila... si te pasas el programa casca.

Con esto no intento desmerecer el ejemplo de do-while, el cual funciona perfectamente, sino comentarte los riesgos de aplicar recursividad a todo.

Además, ten en cuenta que este ejemplo no usa aritmética de punteros.


En línea

do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Calcular longitud de cadena C++ (punteros)
« Respuesta #12 en: 20 Septiembre 2014, 18:14 pm »

¡Buenas!

Cierto lo que ha dicho eferion. Cuando utilizas una función, y dentro de esta haces una llamada a la misma función estas utilizando recursividad. La recursividad la puedes aplicar cuando tienes un problema del que conoces una solución básica y en el que si no te encuentras en esos "casos base", puedes realizar una llamada a la misma función con unos parámetros que ofrecen una solución más sencilla en cada llamada. Por ejemplo en este caso sé cuando una cadena tiene tamaño cero. Así que si no tengo una cadena sin caracteres, hago una llamada con la cadena que tenía en un principio, pero empezando desde el segundo caracter, y al valor devuelto le tendré que sumar uno por el caracter que he eliminado.

Lo malo de esto es que, como ya te han dicho, puedes llenar la pila del programa. La pila es una parte de la memoria del programa donde se guardan las llamadas a las funciones. Si mal no recuerdo, cuando tu llamas a una función lo primero que haces en la pila es reservar espacio para el valor que devuelve la función. Luego se almacena la dirección de memoria en la que está la siguiente instrucción a la llamada, se reserva espacio para las variables locales de la función y por último se incluye el código de la propia función. Cuando aplicas recursividad, si ésta tiene muchos niveles (muchas llamadas sucesivas a la propia función sin que haya un retorno), puedes llegar a llenar la pila, ya que el proceso descrito se lleva a cabo con cada llamada, y tu programa se detendrá o recibirás algún mensaje de error del sistema o vete tu a saber lo que puede pasar.

¡Saludos!
« Última modificación: 20 Septiembre 2014, 18:18 pm por do-while » En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
Bob1098

Desconectado Desconectado

Mensajes: 87


Ver Perfil
Re: Calcular longitud de cadena C++ (punteros)
« Respuesta #13 en: 5 Septiembre 2015, 23:57 pm »

¡Buenas!

Esta función es muy sencilla también:
Código
  1. int longitud(char *s)
  2. {
  3.    if(!(*s))
  4.        return 0;
  5.  
  6.    return 1 + longitud(s + 1);
  7. }
  8.  

¡Saludos!

PD: o con un cuerpo de una sola línea: XD
Código
  1. int longitud(char *s)
  2. {
  3.    return (*s) ? 1 + longitud(s + 1) : 0;
  4. }
  5.  

Me puse a revisar antiguos mensajes y me di cuenta de que no había leído tu respuesta (una lástima por que me parece la función más sencilla y efectiva de todas). Dicho esto, no comprendo muy bien como funciona, solo se que utiliza la recursividad y el if "simplificado". Podrías explicarme un poquito que es lo que hace exactamente?
En línea

Bob1098

Desconectado Desconectado

Mensajes: 87


Ver Perfil
Re: Calcular longitud de cadena C++ (punteros)
« Respuesta #14 en: 5 Septiembre 2015, 23:59 pm »

Acabo de comprenderlo, impresionante optimización =D
En línea

Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[batch] Funcion :len (devuelve la longitud de una cadena)
Scripting
The Shadow 0 2,824 Último mensaje 18 Febrero 2008, 21:32 pm
por The Shadow
Longitud de una cadena en mssql_fetch_object
PHP
Belem 1 2,604 Último mensaje 19 Abril 2010, 16:42 pm
por MazarD
Calcular kilometros en latitud y longitud xD
Foro Libre
Kase 3 4,904 Último mensaje 3 Agosto 2011, 23:42 pm
por raul338
obtener longitud de una cadena sin LEN « 1 2 »
Programación Visual Basic
x64core 11 8,706 Último mensaje 10 Septiembre 2011, 02:24 am
por Psyke1
[C] ¿Por que una cadena acepta mas valores que su longitud? (solucionado)
Programación C/C++
xiruko 8 4,523 Último mensaje 19 Abril 2012, 06:06 am
por david_BS
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines