Передача значения функции в рекурсии в Python - PullRequest
0 голосов
/ 07 июня 2018

Я пытался передать значение из моей рекурсивной вспомогательной функции родителю, но он передает None.Я изучаю Python и рекурсию и пытаюсь понять, как значения передаются между функциями.

def superDigitSum(n,k):
    num2str = [int(i) for i in list(str(n))*k] #creates the list[1,4,8,1,4,8,1,4,8]
    result=0
    return superDigitSumHelper(num2str, result)

def superDigitSumHelper(num2str, helper_result):
    if not num2str :
        return helper_result
    else:
        helper_result+=num2str[-1]
        superDigitSumHelper(num2str[:-1],helper_result)

print(superDigitSum(148,3))

Код создает список [1,4,8,1,4,8,1,4,8] и суммирует значения.Я ожидаю, что результат будет 39 (3 * (1 + 4 + 8)).

Ответы [ 4 ]

0 голосов
/ 07 июня 2018

Если вам разрешено делать такие вещи, как str(n) или list*k, или даже * вообще, это как бы побеждает цель упражнения

def super_digit_sum (n, k):
  return sum (map (int, list (str (n)))) * k

print (super_digit_sum (148, 3)) # 39

Но яуверен, что смысл этого заключается в использовании примитивных функций и операций в качестве средства обучения написанию простых рекурсивных программ ...


Мы начнем с простой функции, которая суммируетцифры одного входного числа

def sum_digits (n):
  if n < 10:
    return n
  else:
    return n % 10 + sum_digits (n // 10)

print (sum_digits (148))
# 13

Затем мы создаем простую функцию, которая может умножать два числа

def mult (n, m):
  if n is 0:
    return 0
  else:
    return m + mult (n - 1, m)

print (mult (3, 7))
# 21

Затем, объединяя два, мы пишем вашу основную функцию

def super_digit_sum (n, k):
  return mult (sum_digits (n), k)

print (super_digit_sum (148, 3))
# 39

Если вам разрешено использовать *, вы можете вообще пропустить mult и просто написать

def super_digit_sum (n, k):
  return sum_digits (n) * k

print (super_digit_sum (148, 3))
# 39

Это лучшая программа, потому что вы получите ответ простым способом.Сравните это с другим подходом: взять число, преобразовать его в строку, разделить на отдельные символы, преобразовать эти символы обратно в цифры, затем суммировать цифры и, наконец, умножить результат на константу.

Оба подхода приводят к одному и тому же результату, но только один результат дает программу, которую стоит прочитать, imo.Я говорю об этом окольном стиле программирования в другом питоне. Q & A: Как считать соседей в списке? Думаю, вы найдете это полезным.

0 голосов
/ 07 июня 2018

Ваша функция немного неправильная.

Вам необходимо добавить возвращаемое значение в вашу superDigitSumHelper функцию:

return superDigitSumHelper(num2str[:-1], helper_result)

в вашем другом условном выражении.

По сути, он не возвращает ничего, потому что после завершения функции он ничего не возвращает, поэтому значением по умолчанию является none.

0 голосов
/ 07 июня 2018

Это предложение возвращает None при следующем вызове стека.Вам необходимо вернуть последнее значение:

else:
    helper_result+=num2str[-1]
    superDigitSumHelper(num2str[:-1],helper_result)

Вместо

else:
    helper_result+=num2str[-1]
    return superDigitSumHelper(num2str[:-1],helper_result)
0 голосов
/ 07 июня 2018

try

else:
    helper_result+=num2str[-1]
    return superDigitSumHelper(num2str[:-1],helper_result)

Не возвращая результаты рекурсивного вызова, вы просто возвращаете Нет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...