Моя python рекурсивная функция не возвращается и превышает максимальную рекурсивную глубину - PullRequest
0 голосов
/ 11 февраля 2020

Я просто не понимаю, почему это не возвращает значение и не останавливает рекурсию. Я перепробовал все, но, кажется, просто продолжаю, независимо от того, что я делаю. Я пытаюсь заставить программу заставить l oop сравнить первые два значения списка, если они совпадают с возвращаемым первым значением. Если это не так, добавьте первое и второе значения каждого списка и сравните, et c et c, пока он не достигнет конца списка. Если сумма значений в каждом списке никогда не равна друг другу в какой-либо точке, тогда возвращается 0.

Предполагается, что требуется три входа:

  1. Одно целое число, определяющее длину следующие два входа
  2. Первый набор входных данных
  3. Второй набор входных данных

Ex вход

3

1 3 3

2 2 2

Должен быть выведен один номер. В случае данных примера это должно вывести 2, потому что сумма списков равнялась второму значению.

N = int(input())
s1 = input().split()
s2 = input().split()
count = 0

def func1(x,y):
        if x == y:
            return(count)
        elif (N - 1) == count:
            return(0)
        else:
            count + 1
            return(func1(x + int(s1[count]), y + int(s2[count])))

days = func1(int(s1[0]),int(s2[0]))
print(days)

Мне заранее жаль, если я действительно испортил форматирование или сделал какую-то глупую ошибку Я довольно новичок в программировании, и я никогда не писал здесь раньше. Заранее спасибо:)

Ответы [ 2 ]

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

Проблема в том, что вы никогда не обновляете переменную count. Тем не менее, просто написать:

count += 1

не будет работать без объявления глобальной переменной:

def func1(x, y):
    global count
    ....

При этом глобальные переменные увеличивают сложность кода и нарушают реинтеграцию, т.е. одна и та же функция больше не может вызываться дважды, не говоря уже о параллелизме. Намного более чистый способ - сделать count аргументом функции, он будет выглядеть так (код не проверен и приведен только для иллюстрации):

N = int(input())
s1 = [int(c) for c in input().split()]
s2 = [int(c) for c in input().split()]

def func1(x, y, count=0):
    if x == y:
        return count
    elif count == N - 1:
        return 0
    else:
        return(func1(x + s1[count], y + s2[count]), count + 1)

days = func1(int(s1[0]),int(s2[0]))
print(days)
0 голосов
/ 11 февраля 2020

Чтобы ответить «Как бы вы go о решении этой проблемы?» - если я правильно понял проблему, цель состоит в том, чтобы найти индекс, в котором «промежуточная сумма» двух списков одинакова. Если это так,

def func1(s1, s2):
    total_a = 0
    total_b = 0
    for i, (a, b) in enumerate(zip(s1, s2)):
        total_a += a
        total_b += b
        if total_a == total_b:
            return i
    return 0


print(func1([1, 3, 3], [2, 2, 2]))

добивается цели. (Я здесь исключил входные биты - эта функция работает только с двумя списками целых чисел.)

...