Dishank Bansal Ответов: 3

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


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

Предположим, что число равно 2476, тогда я хочу вычислить обратное как:-

6*1000 + 7*100 + 4*10 + 2.

Но следующий код делает

6 + 7*10 + 4*100 + 2*1000 = 2476 (само число)

Как получить эти 10^n правильных без использования глобальной или статической переменной и ни с помощью функции math.h.

Также кто-то дал мне подсказку, что с помощью рекурсивной вспомогательной функции это можно сделать. Я все еще не могу понять.

Что я уже пробовал:

#include<stdio.h>

int reverse(int long n){
    int x;
    x = n%10;
    if(n!= 0){
        return (x + reverse(n/10)*10);
    }

    else{
        return 0;
    }
}

int main(void){
    int long n, result;
    printf("Enter a number: ");
    scanf("%ld", &n);
    result = reverse(n);
    printf("\nThe reverse of %ld is %ld\n\n", n, result);

}

Philippe Mori

Если вы напечатаете то, что делает ваш код, вы получите:

Reverse(2) => 2 + Reverse(0) * 10 => 2 + 0 * 10 => 2
Reverse(24) => 4 + Reverse(2) * 10 => 4 + 2 * 10 => 24
Reverse(247) => 7 + Reverse(24) * 10 => 7 + 24 * 10 => 247
Reverse(2476) => 6 + Reverse(247) * 10 => 6 + 247 * 10 => 2476

Таким образом, вам эффективно нужна вспомогательная функция, как предложил ваш друг. По сути, вам нужно будет вызвать функцию, которая принимает 2 аргумента.

Смотрите мой ответ для получения дополнительных подсказок...

3 Ответов

Рейтинг:
4

Patrice T

Вам нужно отслеживать частичный реверс в рекурсии.

#include<stdio.h>

int reverse(int long n, int long r){
	if (n < 10)
	{
		return (r*10+n);
	}
	else
	{
		return reverse(n / 10, r * 10 + n % 10);
	}
}

int main(void){
	int long n, result;
	printf("Enter a number: ");
	scanf("%ld", &n);
	result = reverse(n, 0);
	printf("\nThe reverse of %ld is %ld\n\n", n, result);

}</stdio.h>

Если вы не можете использовать result = reverse(n, 0), вам понадобится вспомогательная функция.


Рейтинг:
13

Philippe Mori

Твой друг прав. Вам нужна вспомогательная функция, поэтому вы должны прислушаться к его советам.

По сути, у вас должно быть что-то вроде:

long reverse_aux(long x, long n) {
  if (n != 0)
  {
    return ??? reverse_aux( ???, n / 10) ???;
  }
  else
  {
    return ???;
  } 
}

long reverse(long n)
{
    return reverse_aux(0, n);
}


Поскольку у вас почти есть логика в вашем исходном коде, это не должно быть трудно заполнить ??? выше. Подсказка: там может быть ??? это следует исключить. Вы должны выяснить, как вы перемещаете часть вашего исходного кода.

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

Или используйте отладчик...

Или используйте карандаш и бумагу...


Dishank Bansal

Не могли бы вы объяснить мне, что здесь делает эта вспомогательная функция?
Я новичок в языке Си. И это моя первая вспомогательная функция. Я не знаю, когда использовать его, и почему использовать его, и как его использовать?

Philippe Mori

Попробуйте что-нибудь сами. Я уже дал вам много информации. Если вы не приложите никаких усилий, вы ничему не научитесь. Учитывая всю информацию в этом ответе и других ответах, вы должны быть в состоянии это сделать.
Почему вам нужна эта функция проста. Это потому, что он не работает с кодом, как ваш. Посмотрите на то, что вы получаете на каждом шаге, и легко понять, что с помощью одного аргумента вы не сможете перевернуть число. Это не имеет ничего общего с тем, чтобы быть новым для С. Сделайте реверс на бумаге, и вы увидите, что вам нужно умножить последнюю цифру более одного раза, если исходное число имеет более 2 цифр. Если вы не понимаете математику, как вы надеетесь ее закодировать?
Если со всей информацией вы все еще не можете решить эту проблему, вам нужно прочитать назад свою заметку о курсе и перестать спать, пока учитель объясняет ее.

Рейтинг:
0

Sergey Alexandrovich Kryukov

10Н это просто результат, который вы могли бы получить в цикле, умножив 1 на 10 N раз или, еще лучше, 10 на 10 N − 1 раз. Вопрос о "глобальной или статической переменной" не имеет значения. Вам никогда не нужна глобальная переменная, но вам всегда нужна переменная вне области действия цикла. "Снаружи" не означает "глобальный"; это просто обычная автоматическая (стековая) переменная. Действительно, глобальные или статические переменные обычно плохи (вы понимаете почему?)…

Надеюсь, вам этого будет достаточно. Я не хочу давать вам полное решение, потому что я не хочу лишать вас ценной возможности научиться чему-то с помощью этого простого упражнения. Это почти невозможно узнать, если вы не решите некоторые проблемы самостоятельно.

Кроме того, похоже, что никто не ограничивает вас в написании только одной функции. В общем, это было бы совершенно непрактично. Итак, вы можете добавить отдельную функцию вычисления 10Н или что-то еще , что вам может понадобиться.

—СА