Autor Tema: División con restas sucesivas C++

0 Usuarios y 1 Visitante están viendo este tema.

05 Noviembre, 2010, 10:27 pm
Leído 8476 veces

Herthorn

  • Junior
  • Mensajes: 30
  • Karma: +0/-0
  • Sexo: Masculino
Hola, buenas. Tengo que hacer una única función recursiva la cual me permita obtener el cociente y el resto de una división a través de restas sucesivas.
La idea sería a un par (a,b) restarle a "a", sucesivamente "b", hasta que "a" sea menor que b. El número que nos quede sería el resto.

Hasta ahí bien y he conseguido hacer el código:

int divisio(int x,int y)

    if (x<y)
    {
        return x;           
    }
    else
    {
        return divisio(x-y,y);
    }

El problema viene en que no sé de que forma ir contando las veces que se realiza la resta (sin realizar bucles, ni otras funciones), para que nuestra función nos diga el cociente.

¿Alguien sabría echarme un cable?

Un saludo y gracias de antemano.


06 Noviembre, 2010, 02:44 am
Respuesta #1

Phicar

  • Experto
  • Mensajes: 514
  • Karma: +1/-0
  • Sexo: Masculino
    • redinfocol.org
con una variable global. Un entero que vaya sumandose 1.

redinfocol.org

06 Noviembre, 2010, 02:59 am
Respuesta #2

Herthorn

  • Junior
  • Mensajes: 30
  • Karma: +0/-0
  • Sexo: Masculino
He probado esa forma, pero me sale una animalada. Un número enorme, la reinicio a cero, al principio... Pero aún así. ¿Dónde debería colocar el incremento?

06 Noviembre, 2010, 04:21 am
Respuesta #3

Phicar

  • Experto
  • Mensajes: 514
  • Karma: +1/-0
  • Sexo: Masculino
    • redinfocol.org
int divisio(int x,int y)

    if (x<y)
    {
        return x;           
    }
    else
    {
        entero++;
        return divisio(x-y,y);
    }
redinfocol.org

06 Noviembre, 2010, 11:00 am
Respuesta #4

Herthorn

  • Junior
  • Mensajes: 30
  • Karma: +0/-0
  • Sexo: Masculino
Hum, lo coloco ahí y tiene valor cero. La verdad es que no entiendo que puede estar pasando.

06 Noviembre, 2010, 07:21 pm
Respuesta #5

cheroky

  • Novato
  • Mensajes: 143
  • Karma: +0/-0
  • Sexo: Masculino
  • Un globo, dos globos, tres globos...
Hola.

Siempre qué no pueda evitarse ya sea por razones de rendimiento, comunicación entre procesos, etcétera, tiene caso utilizar una variable "global". Como opción valida puedes usar un tercer argumento como puntero para obtener el cociente.

Algo como esto, solo valido para números naturales:

int foo(int a, const int b, int* c)
{
     if( a < b ) return a;
     else
     {
        ++*c;
        return foo(a - b, b, c);
     }   
}

/* --- */

int main()
{
int c = 0;   
   
    printf("cociente = %d; resto = %d\n", c, foo(166, 51, &c));

    return 0;
}



También se pueden empaquetar ambos valores en un agregado del tipo estructura o array para ser retornados o pasados como argumento-puntero, pero es algo más engorroso en la codificación.

Un saludo.
\( \color{black} \overrightarrow{\mathbb{C} h\exists \mathbb{R} \varnothing k Y} \)

06 Noviembre, 2010, 11:14 pm
Respuesta #6

Herthorn

  • Junior
  • Mensajes: 30
  • Karma: +0/-0
  • Sexo: Masculino
Muchas gracias, ahora está todo claro.
Lo único que no entiendo es por qué con la idea de la variable global no funcionaba.
El efecto debería ser el mismo, ¿no?

07 Noviembre, 2010, 12:01 am
Respuesta #7

cheroky

  • Novato
  • Mensajes: 143
  • Karma: +0/-0
  • Sexo: Masculino
  • Un globo, dos globos, tres globos...
Desconozco como lo utilizas ya que solo presentas la función y ahí esta todo correcto.

Una opción en C++ (no me percate del titulo del mensaje) con una variable "global":

* Se utiliza el operador ternario pero es exactamente igual que el bloque (if-else) anterior.

* El cualificador static es redundante ya que esa es la categoría de almacenamiento  de una variable con scope global, pero es de buena practica inluirlo. No es necesario inicialización explicita, estos objetos automaticamante lo hacen a cero.

#include <iostream>
using std::cout;

static int c;

int foo(int a, const int b)
{
      return a < b ? a : (c++, foo(a - b, b));
}

int main()
{
   cout << "cociente = " << c <<" resto = " << foo(166, 11);
   
   return 0;
}


Debes tener la cautela de resetear la variable static cada vez que se llame a la función.

Un saludo.
\( \color{black} \overrightarrow{\mathbb{C} h\exists \mathbb{R} \varnothing k Y} \)