2016-03-17 12 views
6

Tôi có một chức năng gọi là đệ quy. Khi tôi chạy nó, tôi nhận được lỗi "độ sâu đệ quy tối đa vượt quá khi gọi một đối tượng Python"Python - Tăng giới hạn đệ quy trong mac osx

Làm cách nào để tăng giới hạn trên mac? Nếu tôi sử dụng những điều sau đây, tôi nhận được lỗi "không thể tăng giới hạn trên mac"

resource.setrlimit(resource.RLIMIT_STACK, (2**24,-1)) 
sys.setrecursionlimit(10**6) 
+0

Đây có thể là [giới hạn Python] (http://stackoverflow.com/a/6809586/3872894), không liên quan gì đến Mac. –

+0

Bạn đã xem xét khả năng viết lại đệ quy của bạn để có sự tăng trưởng ngăn xếp log chứ không phải tăng trưởng stack tuyến tính? Ví dụ, việc tìm kiếm tối đa của một danh sách có thể được thiết lập đệ quy bằng cách so sánh giá trị tối đa cho đến tối đa của phần còn lại của danh sách, nhưng ngăn xếp sẽ tăng tuyến tính theo kích thước của danh sách. Một giải pháp tốt hơn là tìm tối đa nửa đầu của danh sách và nửa thứ hai của danh sách, và lấy số lượng lớn hơn của hai danh sách đó, không thực hiện bất kỳ công việc nào ít hơn nhưng tăng kích thước lôgarit theo kích thước của danh sách . Có lẽ vấn đề của bạn có thể được tái diễn tương tự. – pjs

+1

@pjs thú vị, Bạn có ví dụ về điều đó một cách tình cờ không? – Goodies

Trả lời

0

Tôi đã có một vấn đề mà tôi đã có khả năng tái phát vài tỉ lần, và cách tôi đã làm nó là bằng cách làm phẳng lần đệ quy. Tôi không biết liệu phương pháp này đã được ghi chép trước đây chưa, bởi vì tôi đã tự mình đưa ra nó thay vì tìm ra nó. Tất cả những gì bạn thực sự phải làm là đặt không gian tên cục bộ của mỗi hàm vào một danh sách. Điều này sẽ yêu cầu một sự thay đổi trong mã thực tế của bạn, nếu không có cách giải quyết khác. Dưới đây là cách hoạt động:

Nói rằng tôi có chức năng này:

def flatten_a_list(obj):#[[6,5],7,[3,[9,0]]] -> [6,5,7,3,9,0] 
    flattened = [] 
    for item in obj: 
     if type(item) == list: 
      flattened.append(flatten_a_list(item)) 
     else: 
      flattened.append(item) 
    return flattened 

Bây giờ, đây là truyền thống đệ quy. Để làm cho nó để nó sẽ làm việc cho tuy nhiên nhiều nestings có với không có giới hạn, tôi sẽ làm điều này:

from copy import deepcopy 

def improved(obj):#[[6,5],7,[3,[9,0]]] -> [6,5,7,3,9,0] 
    flattened = [] 
    position = [0] 
    while True: 
     print('position: {}'.format(str(position))) 
     x = deepcopy(obj) 
     try: 
      for index in position: 
       x = x[index] 
     except (IndexError, TypeError): 
      break 

     if type(x) == list: 
      position.append(0) 
      print('continuing') 
      continue 
     else: 
      flattened.append(x) 

     #Test the next position 
     test = deepcopy(position) 
     test[-1] += 1 
     x = deepcopy(test) 
     print('x: {}'.format(x)) 
     try: 
      y = deepcopy(obj) 
      for index in x: 
       y = y[index] 
      position = deepcopy(test) 
     except (IndexError, TypeError): 
      position = position[:-1] 
      try: 
       position[-1] += 1 
      except IndexError: 
       break 

    return flattened 

Hai chữ: tâm uốn

Chức năng tôi đã viết tác phẩm tốt, nhưng nó không được tối ưu hóa. Nếu bạn muốn tốc độ, trước tiên hãy chắc chắn rằng bạn hiểu chức năng, sau đó kết hợp các kiểm tra tràn chỉ mục bằng cách lấy các khối 'x' và 'y' của mã là đa hình hóa chúng.

Bạn sẽ phải điều chỉnh mã này cho mã của bạn, nhưng miễn là bạn hiểu nó, nó không phải là nhiều hoặc một vấn đề. Thêm vào đó, câu trả lời là nền tảng chéo và không giới hạn.

+1

Xin vui lòng giải thích bất kỳ downvote –

Các vấn đề liên quan