Рекурсивная функция для вычисления преемника числовой строки - PullRequest
0 голосов
/ 11 февраля 2019

Я хочу написать рекурсивную функцию, которая вычисляет 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 голосов
/ 12 февраля 2019

Кажется, нет необходимости в умножении или использовании способностей.Учитывая предоставленные вами дополнительные предопределенные функции, я думаю, что здесь был рекурсивный способ выражения длинного сложения с переносом.Я не знаю 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'));
0 голосов
/ 11 февраля 2019

Ключевая проблема заключается в этой логике:

(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
>

TODO

Что произойдет, если successor() будет передана пустая строка:

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

Как вы можете изменить код, чтобы это исправить?Сначала решите, что функция должна вернуть в этой ситуации.Что произойдет, если successor() будет передана строка, представляющая число, слишком большое, чтобы быть в int:

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

Как вы можете изменить код, чтобы исправить это?Опять же, сначала решите, что функция должна вернуть в этой ситуации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...