다양한 Lisps에서 proper list은 nil
(null 값) 또는 cons 셀 중 하나입니다. 여기서 첫 번째 (head, first, car) 값은 값을 가리키고 두 번째 (tail, rest , cdr) 다른 적절한 목록을 가리 킵니다. 얼랭 (Erlang)과 스칼라 (Scala)를 포함하여 다양한 다른 함수형 프로그래밍 언어가이 머리말과 꼬리 기능을 구현합니다.파이썬의 적절한 목록과 재귀 꼬리
(rest (rest (rest (rest (rest (rest()))))))
그것은 nil
을 얻을 것입니다 : 커먼 리스프와 이맥스 리스프에서는 무한 재귀리스트의 꼬리를 찾을 수 있습니다. 파이썬에서 그 동작을 에뮬레이트하고 싶습니다. 물론, 성능을 위해 나는 많이 최적화 된 원시 데이터 유형을 사용하는 것이 좋을 것입니다. 그래서 이것은 단지 운동을위한 것입니다. 내 코드는 다음과 같습니다
class MyList:
def __init__(self, *xs):
self._x = []
self._x.extend(xs)
self.is_empty = not xs
self.head = xs[0] if xs else None
self.tail = MyList(*xs[1:]) if xs[1:] else MyList([])
그러나 tail
를 호출
a = MyList(1,2)
my_list.tail.tail.tail.tail.tail.tail
관련 질문,하지만 내 질문에 대답하지 않는다 : 나는 당신의 예를 조금 재 작성하려고했습니다 LISP cons in python
왜 '꼬리'에 if/else가 필요한가요? – jfs
이 예제에는 큰 런 공간이 있습니까? Asker의 예는 모든 노드에 대한 전체 목록을 복제하므로 (예 : 한 번에 한 요소를 트리밍합니다 .x 노드 목록의 경우 MyList를 구성하여 만든 목록의 전체 크기는 x * x/2. – Wug
@Wug : 아니에요, 광산에는 'MyList'를 구성하기위한 커다란 런 공간이 없습니다 (asker가하지만). 꼬리는 요청할 때만 계산되기 때문에. a.tail.tail. tail.tail ...'은'.tail'의 수에 비례하여 runspace를 가지지 만, 당신의 구현이 무엇이든 관계없이 true가 될 것입니다 (각'.tail '이 그것의 자신의리스트가 될 것을 요구하기 때문에) –