Печать шаблона с использованием рекурсии - PullRequest
0 голосов
/ 10 апреля 2020

Может ли кто-нибудь помочь мне, почему мое ядро ​​умерло, когда я запускаю этот код

Ниже приведен вопрос:

с положительным целым числом n и другим положительным целым числом k < n ,
Ввод: n = 16 k=5
такой, что вывод: 16, 11, 6, 1, -4, 1, 6, 11, 16

код:

def myfunc(no,nr,k,lis=[]):    
    lis.append(nr)
    if nr>=0:
        return myfunc(no,nr-k,k,lis)
    else:
        if no==nr:
            return lis
        else:    
            return myfunc(no,nr+k,k,lis)

myfunc(16,16,5)

Ответы [ 4 ]

0 голосов
/ 10 апреля 2020

Вы получаете бесконечную рекурсию, потому что неправильно тестируете свое условие выхода. Кроме того, мне кажется, что функция должна добавлять в список, если получает от себя, а не обновлять ее путем передачи параметров.

Но вам действительно нужно использовать рекурсию для этого? Кажется, что результат можно получить напрямую, используя два диапазона:

def myFunc(n,k):
      return [*range(n,-k,-k),*range(n%k,n+1,k)]

output:

myFunc(16,5) # [16, 11, 6, 1, -4, 1, 6, 11, 16]

Если вам нужно, чтобы он был рекурсивным, вы должны найти рекурсивный шаблон в результат. Например, движение с обеих сторон к середине уменьшается на k, пока не будет достигнуто отрицательное значение:

def myFunc(n,k):
      if n<=0: return [n]
      return [n]+myFunc(n-k,k)+[n]
0 голосов
/ 10 апреля 2020

Это бесконечная рекурсия, так как она go, как от 16 до 11, от 6 до 1, до -4. После этого начинается бесконечная рекурсия, например, от -4 до 1 и от 1 до -4.

0 голосов
/ 10 апреля 2020

Я понял это

def myfun c (nr, k, lis = [], flag = True):

lis.append(nr)
if flag:
    if nr>0:
        return myfunc(nr-k,k,lis)
    else:
        flag=False
if not flag:
    if nr==lis[0]:
        return lis
    else:    
        return myfunc(nr+k,k,lis,False)
0 голосов
/ 10 апреля 2020

Ваше ядро ​​падает, потому что функция никогда не достигнет базового варианта. Для конкретного вызова, который вы дали, трассировка вызовов будет выглядеть следующим образом:

myfunc(16, 16, 5)
  myfunc(16, 11, 5)
    myfunc(16, 6, 5)
      myfunc(16, 1, 5)
        myfunc(16, -4, 5)
          myfunc(16, 1, 5)

с последними двумя вызовами, повторяющимися навсегда. У вас нет подходящего базового варианта. Я не уверен, каково ваше предполагаемое поведение для функции, но вам нужен базовый случай, который обязательно будет достигнут всеми возможными входными данными, такими как:

if nr < 0:
    return lis
...