2017-01-05 3 views
3

ok, поэтому я готовлюсь к экзаменам на C, и я немного застрял, когда дело доходит до рекурсий. Я новичок в моем университете, и это кажется немного трудно для меня, упражнение требует, чтобы в заданном числе с использованием рекурсивной функции Мне нужно найти наименьший элемент, например: 52873 будет 2, и программа будет необходимо напечатать 2.Как найти наименьший элемент в числе с помощью рекурсии [C]

#include <stdio.h> 

    int min (int number, int element){ 
     if (number==0) 
      return element; 
     if (element>number%10) 
      element=number%10; 

     min(number/10,element); 
    } 

    int main(){ 
     int number; 
     while (scanf("%d",&number)){ 
      printf("%d\n",min(number,9)); 

     } 
    } 

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

+2

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

+1

Посмотрите на предупреждения компилятора: http://ideone.com/CZ9Qf5 – mch

+4

Что касается вашей проблемы и кода, который вы показываете, вы, вероятно, не понимаете его, потому что он * не работает! * У вас есть функция 'min ', который объявлен для возврата значения. Но бывают случаи, когда он * не возвращает значение, приводящее к * неопределенному поведению *. –

ответ

0
int min (int number, int element){ 
    if (number==0) 
     return element; 
    if (element>number%10) 
     element=number%10; 

    min(number/10,element); 
} 

Здесь ваш рекурсивный функция имеет два аргумента. int number, в котором хранится число, из которого должен быть получен наименьший элемент, и int element для хранения наименьшего элемента.

В каждом вызове, то проверьте следующие два условия:

  • if (number > 0) затем вернуться element.
  • if (element > number%10). Здесь number % 10 обозначает последнее число number и сравнивается с element, который изначально установлен в 9. Если номер number % 10 меньше element, тогда значение элемента устанавливается равным number % 10.

После этого процесса вы рекурсивно вызываете функцию со значениями number/10 и element. Причина, по которой вы вызываете number \ 10, заключается в том, что она удаляет последнюю цифру из number, которая уже была проверена в предыдущем вызове.

И, наконец, этот процесс продолжается до тех пор, пока у вас не останется цифр. I.e, number станет нулевым.

Пример: принять min(1234, 9) как вызов от main() функции.

  1. вызов от main() функции

    number = 1234 
    element = 9 
    
    since number != 0 continue; 
    
    since, 1234 % 10 i.e, 4 < 9, element is set to 4 
    

    и функция рекурсивно называется со значениями number = 1234/10 = 123 и element = 4

  2. первый рекурсивная функция вызова:

    number = 123 
    element = 4 
    
    since number != 0 continue; 
    
    since, 123 % 10 i.e, 3 < 4, element is set to 3 
    

    и функция рекурсивно называется со значениями number = 123/10 = 12 и element = 3

  3. второй рекурсивной функции вызова:

    number = 12 
    element = 3 
    
    since number != 0 continue;. 
    
    since, 12 % 10 i.e, 2 < 3, element is set to 2 
    
    and the function is recursively called with values `number = 12/10 = 1` and `element = 2` 
    
  4. третий вызов рекурсивной функции:

    number = 1 
    element = 2 
    
    since number != 0 continue; 
    
    since, 1 % 10 i.e, 1 < 2, element is set to 1 
    

    и функция рекурсивно называется со значениями number = 1/10 = 0 и element = 1

  5. , наконец, в четвертом и последнем рекурсивном вызове:

    number = 0 
    element = 1 
    
    since `number = 0`, the value of the `element` i.e, `1` is returned. 
    
2

Идея программы заключается в следующем:

когда% число на 10, вы получите последнюю цифру, например:

16%10 = 6; 
6%10 = 6; 
536%10 = 6; 

Когда вы/число на 10, вы принимаете из числа последней цифры, например:

16/10 = 1; 
6/10 = 0; (6 = 06) 
536/10 = 53; 

Таким образом, идея вашего рекурсивной ответа, это сохранить в «элемент» наименьшей цифрой, и анализировать каждую цифру рекурсивно путем деления числа на 10 (/) и дела модуль (%).

Но, я думаю, ваше решение имеет проблему, если мой номер равен 0, вы вернетесь 9 в качестве ответа.

1

For More Clearity Давайте посмотрим пример

Как рекурсии работает элемент

ДАВАЙТЕ = 9

каждый раз проверки последняя цифра

min(9154,element)      -----first call 
if(element>4)  
    element=4  -------//now element is 4    
     min(915,element) -------9154/10= 915  ------second call 

     if(element>5) ------here element is 4 so no update 

       min(91,element) ------915/10=91  ------third call 

       if(element>1) 
         element=1 ---------now element is 1 
         min(9,element)  ---------91/10=9 -----fourth call 

         if(9>element)  ---------no update 
          min(0,element) ------9/10=0 
         //since become 0 so it return element 
Смежные вопросы