Удвойте число, используя Рекурсию в C ++

0

Мне трудно понять, как удвоить число с помощью рекурсии, проблема в том, что функция должна быть гибкой, она должна быть вызвана, чтобы удвоить число, а затем удвоить результат и продолжить, пока он не остановится. например, слизь разбивается на 2 каждый раз, когда вы ее ткните, мне нужно как-то использовать рекурсию для представления этого (1-> 2 → 4-> 8-> 16), однако я ударил стену, как я пытаясь понять рекурсию.

Я начинаю с чего-то вроде

int doublesomething(int N, int X){
 return N * X;
}

Затем, помещая это в другую функцию, но я падаю, выясняя, как удвоить его без функции цикла и сброса чисел, я бы связал код, который у меня есть здесь, но это честно просто тарабарщина, поскольку я как бы потерял себя кроличье отверстие рекурсии

int doublethis(int times){
 if (times == 0){
  return 0;
  } else {
   int number;
   doublesomething(2 , number);
   int doubled = doublethis(times - 1);

  }
   return doubled;
}

Это, насколько я понял, и я думаю, что это крайне неправильно.

  • 0
    Вам need рекурсия? Как для домашней работы или что-то?
  • 0
    Да, у него должна быть функция с единственным параметром, которая удваивается внутри него и возвращает количество оставшихся. Я стараюсь не публиковать реальную домашнюю работу, чтобы чему-то научиться, но не могу понять, как использовать рекурсию для удвоения числа. Я думал о том, чтобы иметь одну функцию, которая удваивается, и вызывать ее внутри 2-й функции.
Показать ещё 5 комментариев
Теги:
recursion

5 ответов

1

Я не знаю, намерено ли вы решить этот вопрос, вы можете получить ссылку.

int doublethis(int times){
    int result;
    if (times == 0){
        result = 1;
    }
    if(times > 0) {
        result = 2 * doublethis(times - 1);
    }
    printf("%d \n", result);
    return result;
}

Это простой пример для рекурсии, я думаю, вы можете постепенно выучить алгоритм и провести процесс алгоритма с использованием диаграммы. Если вы вводите время 5, поведение выглядит так:

result5 
= 2 * doublethis(4) 
= 2 * 2 * doublethis(3) 
= 2 * 2 * 2 * doublethis(2) 
= 2 * 2 * 2 * 2 * doublethis(1) 
= 2 * 2 * 2 * 2 * 2 * doublethis(0)
print result0
print result1
print result2
print result3
print result4
print result5
0

Вам нужно какое-то условие завершения, например:

int f(int n, int x)
{
    if (n == 1)
        return x;

    return n * x + f(n - 1, x);
}
  • 0
    Если я правильно следую, это вернет n! так как вы умножаете на время, а не на 2
  • 0
    (на самом деле, x! )
Показать ещё 1 комментарий
0

Для этого вам не нужна рекурсия, но если вам это нужно по какой-то причине (домашняя работа, обучение), на основе вашего кода:

int doublethis(int times, int number) {
  if (times <= 0) {
    return 0;
  } else {
    number *= 2;
    if((--times) > 0)
      number = doublethis(times, number);
    return number;
  }
}

Если вы положительное times всегда будет 1 или более при первом вызове, упрощенная версия:

int doublethis(int times, int number) {
  if (times == 1) {
   return number;
  } else {        
    return doublethis(times-1, number * 2);
  }
}

Или еще короче:

int doublethis(int times, int number) {
  return (times == 1) ? number : doublethis(times-1, number * 2);
}

Это вернет тот же номер, если times 1... если вы хотите, чтобы он фактически удваивал его, если вызывается с times = 1 тогда измените times==1 на times==0 (будет больше смысла)

  • 0
    Вам не понадобится if((--times) > 0) если вместо этого вы вернете number в качестве завершающего условия.
  • 0
    @ KenY-N Я ожидал, что при первом вызове times может быть равно 0, но да, его можно значительно упростить, если вы уверены, что этого не произойдет. Пытался следовать коду ОП и вносить соответствующие изменения.
Показать ещё 2 комментария
0
#include <iostream>

using namespace std;

void doubleThis(int num, int until) {
    if (until == 0) {
        return;
    }
    num = num * 2;
    cout << num << endl;
    doubleThis(num, until-1);
}


int main() {
    int x;
    cout << "Enter the the number to be doubled for next 5 times " << endl;
    cin >> x;
    cout << "Entered number is " << x << endl;
    doubleThis(x, 5);

    return 0;
}

Он завершает последовательность удвоения no для 5 чисел. Вы можете изменить код на столько чисел, сколько хотите.

  • 0
    Извините, если этот комментарий неуместен, но я ненавижу, как в SO люди склонны принимать потребности ОП (без его явного добавления). Откуда вы знаете, что это консольное приложение? Откуда вы знаете, что результат должен быть выведен (а не возвращен, что будет более вероятным и сильно изменит ваш пример)? Почему вы предполагаете, что ему нужен номер, введенный через cin ? Я не пытаюсь уничтожить ваш ответ здесь, но я видел это много раз в SO, и мне кажется, что это неправильно (произошло в другом ответе на этот самый вопрос).
0

Вы можете попробовать это...

#include <iostream>
using namespace std;

void doublethis(int n,int time)
{
    if(time==0)
    return;
    cout<<" -> " <<n*2;
    doublethis(n*2,time-1);
    return; 
}

int main()
{
    int n,time;
    cin>>n>>time;
    cout<<n ;
    doublethis(n,time);
    return 0;
}

если вы хотите удвоить 3 раза четыре раза, вывод этого кода будет

3 -> 6 -> 12 -> 24 -> 48

Ещё вопросы

Сообщество Overcoder
Наверх
Меню