Кодирование целочисленной функции умножения с использованием рекурсии (в C) [закрыто]

Вы также можете просто использовать свои значения в качестве индексов вектора c('no','yes'), добавив 1, когда ваши значения начинаются с 0.

Это будет легко обобщать в случае более двух значений, что не будет работать так хорошо с ifelse:

c('no','yes')[df$col+1]

или

factor(c('no','yes')[df$col+1],c('no','yes'))
-11
задан Blachshma 8 December 2012 в 13:57
поделиться

10 ответов

Хорошо, давайте будем оригинальными. :)

unsigned int mul(unsigned int a, unsigned int b)
{
    if ( !a || !b ) return 0;
    if ( a == 1 ) return b;
    if ( b == 1 ) return a;

    return mul(a-1, b-1)+a+b-1;
}
9
ответ дан 9 September 2019 в 21:07
поделиться

Если вы действительно хотите произвести впечатление на своих сверстников и учителя, отправьте это - это одновременно и рекурсивно, и быстро!

int mul(int a, int b)
{
    if ( a < 0 ) return -mul(-a,b);
    if ( b < 0 ) return -mul(a,-b);
    if ( b == 0 ) return 0;
    return (mul(a,b>>1)<<1)+(b&1?a:0);
}

Добавлено : В качестве дополнительного бонуса это правильно обрабатывает как положительные, так и положительные результаты, отрицательные и нулевые значения.

9
ответ дан 9 September 2019 в 21:07
поделиться

Вот функция:

int mulitplication(x,y)
{
    if (y==0)
    {
      return 0;
    }
    else
      return x+multiplication(x,y-1);
    }
}
5
ответ дан 9 September 2019 в 21:07
поделиться

Вы должны быть более конкретными, если вам нужна хорошая помощь. Но вот рекурсивная функция в C, которая умножает два положительных целых числа:

int multiply(int multiplicand, int multiplier)
{
  if(multiplier == 0)
  {
    return 0;
  }
  return multiply(multiplicand, multiplier - 1) + multiplicand;
}

Джонатан Леффлер писал: А если множитель отрицательный?

Хорошо:

int multiply(int multiplicand, int multiplier)
{
  if(multiplier == 0)
  {
    return 0;
  }
  if(multiplier < 0)
  {
    return multiply(multiplicand, multiplier + 1) - multiplicand; //Edit: changed "+ multiplicand" to "- multplicand"
  }
  return multiply(multiplicand, multiplier - 1) + multiplicand;
}

Марк Байерс писал: Отрицательная версия все еще неверна

Ворчать, ворчать. Обслуживает меня для записи по памяти и без тестирования. Этот тестируется для многих целочисленных диапазонов, отрицательных и положительных, нечетных и четных. Должно работать для любого целочисленного значения. Веселый Винтермас.

3
ответ дан 9 September 2019 в 21:07
поделиться

Альтернативная версия:

int mulInner(int a, int b, int c)
{
    if (b == 0)
        return a*c;
    return mulInner(a, b-1, c+1);
}
int mul(int a, int b)
{
    return multInner(a, b, 0);
}

Эй, он не запретил использовать оператор * ...

2
ответ дан 9 September 2019 в 21:07
поделиться

Добавляйте его к себе снова и снова, N раз. То есть, если вы хотите умножить число на N ..

2
ответ дан 9 September 2019 в 21:07
поделиться

если я не ошибаюсь, это так ...

int mul(int a, int b)
{
if(b==1)
return a;
else
return a+mul(a,b-1);
}
1
ответ дан 9 September 2019 в 21:07
поделиться

Это работает, только если первый операнд больше нуля, но по крайней мере он короткий и запутанный.;)

int mul(int a, int b) {
  return b + (--a ? mul(a, b) : 0);
}

Однако я не убедитесь, что порядок оценки определен, поэтому вам, возможно, придется переместить декремент за пределы выражения:

int mul(int a, int b) {
  a--;
  return b + (a ? mul(a, b) : 0);
}
2
ответ дан 9 September 2019 в 21:07
поделиться
int mul(int a,int b)
{
     if(b==1)
        return a;
     else
        return(a+(mul(a,b-1)));
}
1
ответ дан 9 September 2019 в 21:07
поделиться

50 символов:

m(x,y){return!y?0:rand()%2?m(x,y+1)-x:m(x,y-1)+x;}

Я надеюсь, что набираю очки за использование функции rand() (особенно в таком виде) и общие синтаксические тонкости. В зависимости от вашей системной библиотеки и фазы луны, имейте в виду, что рекурсия может привести к segfault при больших значениях аргументов, например, при вычислении 2 × 3.

0
ответ дан 9 September 2019 в 21:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: