2013-11-19 3 views
-2
def mystery_code(n): 
    return mystery_recursive(n, n-1) 

def mystery_recursive(a, b): 
    if b<=0: 
     return 0 
    else: 
     c=mystery_recursive(a,b-1) 
     if a%b==0: 
      c+=b 
     return c 

Может кто-то, пожалуйста, помогите мне понять, что делает этот код?Mystery рекурсивная функция python

+2

Как вы думаете, что это делает? –

+7

Это очень похоже на домашнее задание, которое я назначил своим ученикам не так давно ... :-) – bitgarden

+0

Вы пытались запустить его и посмотреть, что происходит? Вы можете сказать, что это не испортит ваш компьютер, просто посмотрев на него, поэтому ... – jwodder

ответ

6

Он вычисляет сумму собственных делителей n.

Если вы пошагово код, который вы увидите, что он называет, например, mystery_recursive(5, 4), а затем рекурсивно mystery_recursive(5, 3), mystery_recursive(5, 2), mystery_recursive(5, 1), mystery_recursive(5, 0). Затем он вернет 0, потому что b <= 0.

В каждом из этих вызовов, он присваивает результат вызова c и если a % b == 0 (т.е. a можно разделить на b), то это добавляет к bc. Таким образом, вы получите сумму правильных делителей n.

+0

больше похоже на сумму ** отдельных факторов ** 'n'. – tMJ

+0

@tMJ в чем разница между отдельными факторами и делителями (определение)? –

+0

@SimeonVisser: правильные делители, правда, правильно? Это не означает 'n'. – DSM

0

Как уже сказал Симеон Виссер, приведенный выше код вычисляет сумму собственных делителей n.

если ваш вызов функции:

mystery_code (12)

, то он будет вызывать рекурсивную функцию тайны (mystery_recursive (а, б)) в вашем коде, как:

mystery_recursive (12, 11)

Как только рекурсивная функция начнет выполняться, она будет продолжать называть себя до тех пор, пока не будет удовлетворено условие b < = 0. В этом случае mystery_recursive (12, 0) вернет значение '0' в переменную 'c' в свою вызываемую функцию mystery_recursive (12, 1). Затем, начиная с вышеупомянутой функции тайны (mystery_recursive (12, 1)), значение «c» будет вычисляться и возвращаться к их соответствующим вызывающим функциям того же самого значения до вызываемой функции mystery_recursive (12, 11).

Выход в этом случае: 16

0

Возможно, это помогает преобразовать эту рекурсивную функцию к Interative версии

def mystery_recursive(a, b): 
    c = 0 
    while True: 
     if b <= 0: 
      return c 
     if a % b == 0: 
      c += b 
     b -= 1 

Это все еще немного неуклюже, поэтому постарайтесь, чтобы преобразовать его в выражение генератора суммы

def mystery_recursive(a, b): 
    return sum(b for b in range(b, 0, -1) if a % b == 0) 

Вы можете даже катиться, что обратно в mystery_code

def mystery_code(n): 
    return sum(b for b in range(n - 1, 0, -1) if n % b == 0) 
Смежные вопросы