ps1-solutions.pdf

Stirling’s approximation

image.png
image.png

Problem 1-3. [20 points] Binder Bookmarks

这个问题有意思

Problem 1-4. [44 points] Doubly Linked List

  1. class Doubly_Linked_List_Node:
  2. def __init__(self, x):
  3. self.item = x
  4. self.prev = None
  5. self.next = None
  6. def later_node(self, i):
  7. if i == 0: return self
  8. assert self.next
  9. return self.next.later_node(i - 1)
  10. class Doubly_Linked_List_Seq:
  11. def __init__(self):
  12. self.head = None
  13. self.tail = None
  14. def __iter__(self):
  15. node = self.head
  16. while node:
  17. yield node.item
  18. node = node.next
  19. def __str__(self):
  20. return '-'.join([('(%s)' % x) for x in self])
  21. def build(self, X):
  22. for a in X:
  23. self.insert_last(a)
  24. def get_at(self, i):
  25. node = self.head.later_node(i)
  26. return node.item
  27. def set_at(self, i, x):
  28. node = self.head.later_node(i)
  29. node.item = x
  30. def insert_first(self, x):
  31. ###########################
  32. # Part (a): Implement me! #
  33. ###########################
  34. item = Doubly_Linked_List_Node(x)
  35. if self.head is None:
  36. self.head = item
  37. self.tail = item
  38. else:
  39. item.next = self.head
  40. self.head.prev = item
  41. self.head = item
  42. def insert_last(self, x):
  43. ###########################
  44. # Part (a): Implement me! #
  45. ###########################
  46. item = Doubly_Linked_List_Node(x)
  47. if self.tail is None:
  48. self.head = item
  49. self.tail = item
  50. else:
  51. item.prev = self.tail
  52. self.tail.next = item
  53. self.tail = item
  54. def delete_first(self):
  55. assert self.head
  56. x = self.head.item
  57. ###########################
  58. # Part (a): Implement me! #
  59. ###########################
  60. self.head = self.head.next
  61. if self.head is None:
  62. self.tail = None
  63. else:
  64. self.head.prev = None
  65. return x
  66. def delete_last(self):
  67. assert self.tail
  68. x = self.tail.item
  69. ###########################
  70. # Part (a): Implement me! #
  71. ###########################
  72. self.tail = self.tail.prev
  73. if self.tail is None:
  74. self.head = None
  75. else:
  76. self.tail.next = None
  77. return x
  78. def remove(self, x1, x2):
  79. L2 = Doubly_Linked_List_Seq()
  80. ###########################
  81. # Part (b): Implement me! #
  82. ###########################
  83. L2.head = x1
  84. L2.tail = x2
  85. if x1 == self.head:
  86. self.head = x2.next
  87. else:
  88. x1.prev.next = x2.next
  89. if x2 == self.tail:
  90. self.tail == x1.prev
  91. else:
  92. x2.next.prev = x1.prev
  93. x1.prev = None
  94. x2.next = None
  95. return L2
  96. def splice(self, x, L2):
  97. ###########################
  98. # Part (c): Implement me! #
  99. ###########################
  100. xn = x.next
  101. x1 = L2.head
  102. x2 = L2.tail
  103. L2.tail = None
  104. L2.head = None
  105. x1.prev = x
  106. x.next = x1
  107. x2.next = xn
  108. if xn is None:
  109. self.tail = x2
  110. else:
  111. xn.prev = x2