【问题标题】:What would be the base case of recursive function that should find sum of numbers in a string什么是递归函数的基本情况,应该在字符串中找到数字的总和
【发布时间】:2020-07-29 11:00:21
【问题描述】:

例如,int num(char [100]) 是一个查找字符串中数字总和的函数。

例如“123omaewamou7”应该返回 130

我尝试反复进行,似乎我已经掌握了它。但我也很好奇如何递归地做到这一点。虽然我什至没有想出递归函数的基本案例。

我的第一个假设是我将像在迭代案例中那样检查字符串的每个字符。

你能给出什么提示来找到基本情况?

【问题讨论】:

  • 基本情况是没有什么可以求和,所以是一个没有数字的字符串,不是吗?
  • @MOehm 所以当字符遇到非数字时,我将返回找到的数字,如果没有,我只返回总和?
  • 没有。当字符串中没有数字时,返回零。否则,返回第一个数字的值加上该数字后面的字符串的字符串总和。

标签: c recursion integer data-extraction function-definition


【解决方案1】:

你可以检查剩下的字符串,我的意思是,如果你在基本情况下只有数字,你就返回那个数字。

【讨论】:

    【解决方案2】:

    您可以使用 sscanf。我相信循环会更好,但这里是递归版本。

    #include <stdio.h>
    
    int calculateSum(char *string, int sum) {
        if (*string == '\0') return sum;
    
        int len = 0;
        int value = 0;
    
        if (sscanf(string, "%d%n", &value, &len) == 1) {
            sum += value;
        } else {
            len = 1;
        }
    
        string += len;
    
        return calculateSum(string, sum);
    }
    
    int main() {
        printf("%d\n", calculateSum("123omaewamou7", 0));
    }
    

    【讨论】:

      【解决方案3】:

      递归函数的基本情况是条件*s == '\0',其中s 是传递给函数的字符串。那是遇到字符串的终止零的时候。

      const char * 类型的函数只声明一个参数就足够了。并且返回类型应该是long long int。这降低了溢出的风险。

      函数可以基于使用标准C函数strtoll

      这是一个演示程序。

      #include <stdio.h>
      #include <stdlib.h>
      #include <ctype.h>
      
      long long int sum( const char *s )
      {
          long long int value = 0;
      
          if ( *s )
          {
              if ( isdigit( ( unsigned char )*s ) || *s == '+' || *s == '-' )
              {
                  char *p;
      
                  value = ( strtoll( s, &p, 10 ) );
      
                  s = p;
              }
              else
              {
                  ++s;
              }
      
              value += sum( s );
          }
      
          return value;
      }
      
      int main(void) 
      {
          const char *s = "123omaewamou7";
      
          printf( "sum = %lld\n", sum( s ) );
      
          return 0;
      }
      

      程序输出是

      sum = 130
      

      您可以通过以下方式使用标准 C 函数 isdigit(以及相应的标头 &lt;ctype.h&gt;)排除

      long long int sum( const char *s )
      {
          long long int value = 0;
      
          if ( *s )
          {
              if ( ( '0' <= *s && *s <= '9' ) || *s == '+' || *s == '-' )
              {
                  char *p;
      
                  value = ( strtoll( s, &p, 10 ) );
      
                  s = p;
              }
              else
              {
                  ++s;
              }
      
              value += sum( s );
          }
      
          return value;
      }
      

      【讨论】:

      • 只声明一个参数就够了:代码更干净,但是这样编译器就无法使用尾递归进行优化了。
      猜你喜欢
      • 1970-01-01
      • 2017-02-07
      • 2021-09-01
      • 2016-06-25
      • 1970-01-01
      • 2020-03-12
      • 2017-06-06
      • 2013-12-06
      • 2017-06-13
      相关资源
      最近更新 更多