【问题标题】:How to find the smallest element in a number using a recursion [C]如何使用递归找到数字中的最小元素 [C]
【发布时间】:2017-05-20 02:03:18
【问题描述】:

好的,所以我正在准备我的 C 考试,但在递归方面我有点卡住了我需要找到最小元素的递归函数,例如:52873 将是 2,程序需要打印 2。

#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));

        }
    }

这是练习答案的代码,但我不明白它,并且很想了解为什么它会这样解决,因为我真的不明白它以及解决它的不同方法,谢谢提前这么多。

【问题讨论】:

  • 抱歉吹毛求疵,但术语很重要。你的意思是找到一个数字中最小的digit
  • 查看编译器警告:ideone.com/CZ9Qf5
  • 至于你的问题和你展示的代码,你可能不明白,因为它不起作用!你有一个函数,min,它是声明返回一个值。但在某些情况下,它返回值,导致未定义的行为
  • min(number/10,element); 应该是 return min(number/10,element);
  • 如果您输入的不是数字(比如字母x),那么scanf 函数将返回零并且循环应该结束。但是,如果您按下文件结尾组合键(Ctrl-D 在 Linux/macOS 上,Ctrl-Z 在 Windows 上)然后 scanf 返回 EOF 这是 not 零和循环不会结束。

标签: c recursion


【解决方案1】:

程序的思路如下:

当你将一个数字除以 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 作为答案。

【讨论】:

    【解决方案2】:

    为了更清楚,让我们看一个例子

    递归的工作原理

    让我们元素=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
    

    【讨论】:

      【解决方案3】:
      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 &gt; 0) 然后返回element
      • if (element &gt; number%10)。这里,number % 10 表示number 的最后一个数字,它与最初设置为9element 进行比较。如果number % 10 小于element,则元素的值设置为number % 10

      在上述过程之后,您递归调用具有值number / 10element 的函数。您之所以调用number \ 10,是因为它会从number 中删除最后一个数字,该数字已在上一次调用中检查过。

      最后,这个过程一直持续到你没有留下任何数字,即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 = 123element = 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 = 12element = 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 = 0element = 1

      5. 终于在第四次也是最后一次递归调用中:

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

      【讨论】:

        【解决方案4】:

        使用递归查找大于 0 的整数的最低位:

        int min_digit_rec(int num)
        {
        if (num < 10)
            return num;
        else    
                {
                    int l_digit;
                    int r = min_digit_rec(num / 10);
                    
                    l_digit = num % 10;
                    return r < l_digit ? r : l_digit;
                }
            
        }
        

        【讨论】:

          猜你喜欢
          • 2020-07-03
          • 2016-03-27
          • 1970-01-01
          • 2012-03-16
          • 1970-01-01
          • 2016-07-05
          • 1970-01-01
          • 1970-01-01
          • 2010-12-16
          相关资源
          最近更新 更多