2015-07-03 11 views
-1

Я довольно новичок в python, и я попытался использовать его, чтобы сделать программу для определения n-го термина для последовательности Stern-Brocot (вы можете посмотреть, что , и именно поэтому моя функция называется SBSeq). По какой-то причине, он не будет работать, и он приходит с ошибками, например:Созданная функция не работает (Python)

File "C:/Python27/Factorials.py", line 6, in SBSeq 
return ((n%2)*SBSeq(ceil(n/2)-1))+SBSeq(ceil(n/2)) 

который в конечном счете идет на это:

File "C:/Python27/Factorials.py", line 5, in SBSeq 
if n == 1: return 1 
RuntimeError: maximum recursion depth exceeded in cmp 

Это исходный код.

import math 
from math import ceil 

def SBSeq(n): 

if n == 1: return 1 
return ((n%2)*SBSeq(ceil(n/2)-1))+SBSeq(ceil(n/2)) 

Любая помощь будет оценена!

+0

О.П. следующего вопроса имеет те же проблемы, как вы. Пожалуйста, проверьте: http://stackoverflow.com/questions/24997970/iterating-over-parts-of-the-stern-brocot-tree-in-python –

+0

Ваш код даже не компилируется. Пожалуйста, отправьте правильный код. – juanchopanza

+0

Я предполагаю, что функция вызывается с отрицательными входами, а для отрицательных входов нет раннего условия выхода, 'ceil (n/2) -1' выглядит подозрительно. Обратите внимание, что '0 * some_function()' не будет замыкаться на 0. –

ответ

2

Предполагая, что вопрос отступа не является реальной проблемой, проблема в том, что ваши номера могут достигать ниже 1 при переходе рекурсивен, а затем, как только он достигает ниже 1 (то есть п достигает 0), он держит на вызов SBSeq рекурсивно без выход.

Условие в начале рекурсивной функции должно быть if n <= 1 : return 1.

код -

def SBSeq(n): 
    if n <= 1: return 1 
    return ((n%2)*SBSeq(ceil(n/2)-1))+SBSeq(ceil(n/2)) 
1

SBSeq(2) звонки SBSeq(0), SBSeq(0) вызовы SBSeq(-1) и SBSeq(-1) звонки SBSeq(-1) навсегда.

Просто добавьте специальный чехол для SBSeq(0).

0

Из отладчика вы можете обнаружить, что SBSeq(2) звонки SBSeq(0), а затем бесконечно звонки SBSeq(-1). Эта функция также должна закончиться, когда n получить меньше или равно 1.

Это улучшенная функция:

import math 
from math import ceil 

def SBSeq(n): 
    if n <= 1: return 1 # not n == 1 
    return ((n%2)*SBSeq(ceil(n/2)-1))+SBSeq(ceil(n/2)) 

 Смежные вопросы

  • Нет связанных вопросов^_^