使用递归函数查找相同数字的最大序列(c++)[已关闭]

wbgh16ku  于 2023-01-15  发布在  其他
关注(0)|答案(1)|浏览(151)

编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
4天前关闭。
Improve this question
我需要使用递归函数找到给定整数中相同数字的最大序列。例如:

input: "2221", output: 3
input: "2223333", output: 4
input: "222333", output: 3

由于某种原因,代码有时工作正常,有时不工作。当我输入"1112",然后它给我正确的输出(3),但是当我输入"1111555"时,我期望得到输出4,结果反而得到了6,还有,我不能改变函数接收的参数所以如果有人知道如何将参数插入函数内部而不是外部(如果我把它们插入函数中,那么我收到的输出总是0)我真的很感激帮助,所以提前感谢你:)
我的代码:

int currentLength = 0, maxLength = 0;
int currentDigit = -1;
int maxSequence(int num)
{
    if (num <= 0)
        return maxLength;
    int digit = num % 10;
    if (digit == currentDigit) {
        maxLength= 1 + maxSequence(num / 10);
    }
    else {
        currentDigit = digit;
        if (maxLength > 1)
        {
            maxLength = 0;
        }
        else
        {
            maxLength = 1;
        }
        return maxSequence(num / 10);
    }
}
k2fxgqgv

k2fxgqgv1#

递归和可变全局变量是一个讨厌的组合。
您可以将参数添加到其他函数并调用该函数。
大概是这样的

// Since you can't use std::max.
int max(int a, int b) { return a > b ? a : b; }

int maxSequenceHelper(int number, int last, int length, int maximum)
{
    int digit = number % 10;
    if (digit == last)
    {
        length += 1;
        maximum = max(length, maximum);
    }
    else
    {
        length = 1;
    }
    return number < 10
        ? maximum
        : maxSequenceHelper(number / 10, digit, length, maximum);
}

int maxSequence(int number)
{
    return maxSequenceHelper(number / 10, number % 10, 1, 1);
}

这里有一个没有任何赋值的版本,这样推理起来就稍微容易一些:

int maxSequenceHelper(int number, int last, int length, int maximum)
{
    const int digit = number % 10;
    const int new_length = digit == last ? length + 1 : 1;
    const int new_maximum = max(new_length, maximum);
    return number < 10
        ? new_maximum
        : maxSequenceHelper(number / 10, digit, new_length, new_maximum);
}

相关问题