рекурсивные функции цифр положительного десятичного целого числа в обратном порядке переполнения стека

У меня есть задание, чтобы написать рекурсивную функцию, которая записывает цифры положительного целого числа в обратном порядке. Моя проблема в том, что функция не отображает реверс правильно. Я знаю, что я должен использовать% или 10 при отображении числа и / или 10, когда в рекурсивном вызове, а также базовый случай должен быть < 10. Вот мой код.

#include <iostream>
using namespace std;

int reverse(int,int);

int main()
{
int number;
int n;

cout << " Enter number to reverse." << endl;
cin >> number;
cout << reverse(number % 10,0);

return 0;
}//end main

int reverse(int number,int n)
{

if(n < 10)
{
return n;
}
else
{
return reverse(number/10,n);
}
}// end reverse

2

Решение

Я думаю, что ваша функция должна быть такой:

void reverse(int number){
if(number == 0) //base/basic case i.e if number is zero the problem is already solved, nothing to do, so simply return
return;
else{
cout << number % 10; // print that last digit, e.g 103%10 == 3
reverse(number/10); //solve the same problem but with smaller number, i.e make the problem smaller by dividing it by 10,  initially we had 103, now 10
}
}
3

Другие решения

Вы можете использовать следующий код (если вы не против чередовать начальные нули или можете накапливать символы в строке или в ostringstream)

unsigned reverse(unsigned n, unsigned acc)
{
if (n == 0)
{
return acc;
}
else
{
return reverse(n / 10, (acc * 10) + (n % 10));
}
}

unsigned reverse(unsigned n)
{
return reverse(n, 0);
}
1

Это решение пропустит конечные нули, потому что оно буквально переворачивает содержимое целого числа:

int reverse(int number, int n = 0)
{
if (number == 0)
{
return n;
}
else
{
int nextdigit = number%10;
int nextprefix = n*10+nextdigit;
return reverse(number/10 ,nextprefix);
}
}
1

Вы также можете сделать:

int reverse(int number,int n) {
if(number > n) {
cout << number << endl;
reverse(number-1,n);
}

Но вы должны избавиться от печати первого номера дважды.

0
int rev(int n) {
if(n<10&&n>-10) return n;

int length=0;
for (int i=n; i; i/=10) length++;

return n%10*(int)pow(10, length-1) + rev(n/10);

}

Вот мое решение. Он принимает только один параметр и возвращает int.
Также не забудьте включить cmath.

int intLength(int i) {
int l=0;
for(;i;i/=10) l++;
return l;
}

int rev(int n) {
return n<10&&n>-10 ? n : n%10*(int)pow(10, intLength(n)-1) + rev(n/10);
}

Или так немного элегантнее.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector