Мне трудно понять, как удвоить число с помощью рекурсии, проблема в том, что функция должна быть гибкой, она должна быть вызвана, чтобы удвоить число, а затем удвоить результат и продолжить, пока он не остановится. например, слизь разбивается на 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;
}
Это, насколько я понял, и я думаю, что это крайне неправильно.
Я не знаю, намерено ли вы решить этот вопрос, вы можете получить ссылку.
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
Вам нужно какое-то условие завершения, например:
int f(int n, int x)
{
if (n == 1)
return x;
return n * x + f(n - 1, x);
}
n!
так как вы умножаете на время, а не на 2
x!
)
Для этого вам не нужна рекурсия, но если вам это нужно по какой-то причине (домашняя работа, обучение), на основе вашего кода:
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
(будет больше смысла)
if((--times) > 0)
если вместо этого вы вернете number
в качестве завершающего условия.
times
может быть равно 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 чисел. Вы можете изменить код на столько чисел, сколько хотите.
cin
? Я не пытаюсь уничтожить ваш ответ здесь, но я видел это много раз в SO, и мне кажется, что это неправильно (произошло в другом ответе на этот самый вопрос).
Вы можете попробовать это...
#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
need
рекурсия? Как для домашней работы или что-то?