Мне нужна функция, которая принимает n и возвращает 2 n - 1 . Это звучит достаточно просто, но функция должна быть рекурсивной. Пока у меня всего 2 н :
def required_steps(n):
if n == 0:
return 1
return 2 * req_steps(n-1)
В упражнении говорится: «Можно предположить, что параметр n всегда является положительным целым числом и больше 0»
1 << n
не могут быть переполнены. Это кажется упражнением в изобретении способа разложения(1<<n) - 1
на несколько шагов, возможно, устанавливая каждый бит по одному, как показывают некоторые ответы.def fn(n): if n == 0: return 1; return (2 << n) - fn(0); # technically recursive
C:\MyFolder
Ответы:
2**n -1
также 1 + 2 + 4 + ... + 2 n-1, которая может быть превращена в одну рекурсивную функцию (без второй, чтобы вычесть 1 из степени 2).Подсказка : 1 + 2 * (1 + 2 * (...))
Решение ниже, не смотрите, хотите ли вы сначала попробовать подсказку.
Это работает, если
n
гарантированно больше нуля (как было обещано в постановке задачи):Более надежная версия будет обрабатывать также нулевые и отрицательные значения:
(Добавление проверки на нецелые числа оставлено в качестве упражнения.)
источник
required_steps(0)
теперь вызывает бесконечную рекурсию2^0 - 1
== 0. Добавьте еще одинif
для этого случая.int
, мы не знаем, что делать, когда n <0. Рассчитать? Киньте ошибку? Вернуть 0? В этом случае мы можем выполнять только частичную функцию (определить ее для вещей, которые мы знаем, каков результат).0
и используетсяn - 1
для подзадачи. Домен Натуральных Чисел кажется подходящим.Чтобы решить проблему с рекурсивным подходом, вы должны выяснить, как вы можете определить функцию с заданным входом в терминах той же функции с другим входом. В этом случае, так как
f(n) = 2 * f(n - 1) + 1
вы можете сделать:так что:
выходы:
источник
Вы можете извлечь действительно рекурсивную часть в другую функцию
Или вы можете установить флаг и определить, когда вычитать
источник
Используя дополнительный параметр для результата,
r
-Вы также можете написать это с помощью побитового сдвига влево,
<<
-Выход такой же
источник
else
предложении ни в одной функцииr * 2
вr << 1
том, что это «вообще не читается»? Thankn
и затем вычитает 1. Кажется, даже менее изящно, чем необходимо, хотя все это упражнение по сравнению с неэффективностью(1<<n) - 1
.Иметь заполнитель для запоминания исходного значения n, а затем для самого первого шага, т. Е.
n == N
Возврата2^n-1
источник
Один из способов получить смещение «-1» - применить его при возврате из первого вызова функции, используя аргумент со значением по умолчанию, а затем явно установить аргумент смещения в ноль во время рекурсивных вызовов.
источник
Вдобавок ко всем удивительным ответам, данным ранее, ниже будет показана его реализация с внутренними функциями.
По сути, это присвоение глобального значения n для k и повторение через него с соответствующими сравнениями.
источник