递归函数,用于计算数字字符串的后继

时间:2019-02-10 23:36:02

标签: c algorithm recursion

我想编写一个计算Succ(‘2468’) = '2469'的递归函数。 ‘2468’是一个数字字符串。

该练习给了我一些预定义的函数,例如last(ch),该函数返回字符串的最后一个字符start(ch),返回ch,而没有最后一个字符addEnd(ch, c),在c的末尾添加ch并要求我返回一个字符串作为最终结果(即suc("123")="124"

我尝试了此代码,但它仅适用于2个字符的字符串。如果我的字符串长度> 2,则不起作用:

int successor (char*ch)
{
 if (strlen (ch)==1)
 return (int(*ch))+1);
 else 
  return ((int(*ch))*10+successor(ch+1));}

2 个答案:

答案 0 :(得分:2)

一个关键问题是这种逻辑:

(int(*ch))*10+successor(ch+1)

乘以10对于大数是不够的。我们需要乘以10的乘方,我们已经计算出了该乘方,但并没有挂在它上面:

strlen (ch)

或更具体地说:

strlen(ch) - 1

完整的解决方案:

#include <math.h>
#include <stdio.h>
#include <string.h>

#define digit(c) (c - '0')

int successor(char *string)
{
    size_t power = strlen(string) - 1;

    if (power == 0)
    {
        return digit(*string) + 1;
    }

    return digit(*string) * pow(10, power) + successor(string + 1);
}

int main() {
    printf("%d\n", successor("2999"));

    return 0;
}

输出

> ./a.out
3000
>

待办事项

如果successor()传递了一个空字符串会发生什么:

printf("%d\n", successor(""));

如何修改代码以解决此问题?首先确定在这种情况下函数应该返回什么。如果向successor()传递了一个字符串,该字符串表示一个太大而不能包含在int中的数字,那么会发生什么:

printf("%d\n", successor("8589934592"));

如何修改代码以解决此问题?再次,首先确定函数 在这种情况下应该返回什么。

答案 1 :(得分:2)

似乎没有必要相乘或使用幂。考虑到您提供了额外的预定义功能,我想这里的目的是一种递归方式来表示长时间加进位。我不了解C,但这是JavaScript中的一个语法非常接近的插图。我希望这会有所帮助。

function successor(s){
  if (s.length == 1){
    if (s == '9'){
      return '10';
      
    } else {
      // Return the successor character,
      // not sure how this looks in C.
      return String.fromCharCode(
        s.charCodeAt(0) + 1);
    }
  }
  
  let rightmost = successor(last(s));
  
  // No carry so just return
  // the string with the last
  // character incremented
  if (rightmost != '10'){
    return addEnd(start(s), rightmost);
    
  // We have a carry so
  // continue the recursion
  } else {
    return addEnd(successor(start(s)), '0');
  }
}

function last(s){
  return s.substr(-1);
}
function start(s){
  return s.substr(0, s.length - 1);
}
function addEnd(s, c){
  return s + c;
}
    
console.log(successor('2999'));

相关问题