Верно, но ложно в рекурсии - PullRequest
0 голосов
/ 18 февраля 2020

Я хочу подсчитать, есть ли в моем массиве k-й последовательный номер. Например, если мы хотим проверить, есть ли (k =) 3 последовательных номера, функция вернет:

[0,0,1,1,1,3,4,5,4,3] = true
[0,0,1,2,1,3,4,5,4,3] = false

Я пишу

def seq(a, n, k):
    if n == 1:
        return 0
    if k <= 1:
        return 1
    return (a[0] == a[1] and seq(a[1:], n-1, k - 1)) or seq(a[1:], n - 1, k)`

Но когда я звоню (seq (массив, len (массив), 3)) для [2, 0, 0, 2, -4, -4, 0, 5, 0, 65, 66, 67] возвращается 1 вместо 0

1 Ответ

1 голос
/ 18 февраля 2020

Похоже, вы запутались в том, что вы должны иметь в качестве аккумулятора. То, что вы должны накапливать, это последнее, что вы видели, и сколько раз вы видели это. Где a равно списку, который мы проверяем, n - это количество раз, которое мы видели элемент e, а k - количество последовательных элементов, которые мы должны достичь.

def seq(a, k):
    def seq_acc(a, n, e, k):
        if not a:
            return n == k
        if n == k:
            return True
        if e == a[0]:
            return seq_acc(a[1:], n+1, e, k)
        else:
            return seq_acc(a[1:], 1, a[0], k)
    if not a:
        return False
    else:
        return seq_acc(a[1:], 1, a[0], k)
...