def mylist(val, lst=[]): lst.append(val) return lst 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

def mylist(val, lst=[]): lst.append(val) return lst

Поиск

def mylist(val, lst=[]): lst.append(val) return lst

 

print mylist(1), print mylist(2)

 

Вместо ожидаемого [1] [2] получается [1] [1, 2],так как добавляются элементы к"значению по умолчанию".

 

Правильный вариант решения будет,например,таким:

 

def mylist(val, lst=None):


 


lst = lst or [] lst.append(val) return lst

 

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

 

Рекурсия

 

В некоторых случаях описание функции элегантнее всего выглядит с применением вызова этой же функции.Такой прием,когда функция вызывает саму себя,называется рекурсией.В функциональных языках рекурсия обычно используется много чаще,чем итерация(циклы).

В следующем примере переписывается функция bin() в рекурсивном варианте:

 

def bin(n):

 

"""Цифры двоичного представления натурального числа """

 

if n == 0: return []

n, d = divmod(n, 2) return bin(n) + [d]

 

print bin(69)

 

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

 

Конечно,в погоне за красивым рекурсивным решением не следует упускать из виду эффективность реализации.В частности,пример реализации функции для вычисления n-го числа Фибоначчи это демонстрирует:

 

def Fib(n): if n < 2:

 

return n else:

 

return Fib(n-1) + Fib(n-2)

 

В данном случае количество рекурсивных вызовов растет экспоненциально от числа n,что совсем не соответствует временной сложности решаемой задачи.

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

Предупреждение:

 

При работе с рекурсивными функциями можно легко превысить глубину допустимой вPython рекурсии. Для настройки глубины рекурсии следует использовать функцию setrecursionlimit(N) из модуля sys,установив требуемое значение N.

 



Поделиться:


Последнее изменение этой страницы: 2024-06-27; просмотров: 63; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.217.128 (0.007 с.)