2013-10-23 24 views
5

Làm việc trên một dự án Python cho CS1, và tôi đã đi qua một vấn đề kỳ lạ mà cả tôi hoặc tôi đều không thể tìm ra. Phạm vi chung của mã là để điền vào một mạng lưới 0 với hình dạng của một kích thước nhất định bằng cách sử dụng số để lấp đầy không gian, và chúng tôi phải kiểm tra trên đường đi để đảm bảo rằng chúng tôi arent đặt hình dạng ở những nơi đã có hình dạng. Tôi có hai chức năng ở đây, cả hai thực hiện hầu như cùng một điều, nhưng vì lý do gì khi falsechecker trả về danh sách nó trả về nó như là một NoneType. Tại sao chuyện này đang xảy ra?Chức năng Trả về NoneType bằng Python?

def falseChecker(binList, r, c, size): 
    sCheck = isSpaceFree(binList, r, c, size) 
    if sCheck == True: 
     for x in range(c, c+size): 
      for y in range(r, r+size): 
       binList[x][y] = size 
     return binList 
    else: 
     c += 1 
     if c > len(binList): 
      c = 0 
      r += 1 
      if r > len(binList): 
       return binList 
     falseChecker(binList, r, c, size) 





def iChecker(binList, blockList): 
    r = 0 
    c = 0 
    for i in blockList: 
     check = isSpaceFree(binList, r, c, i) 
     if check == True: 
      for x in range(c, c+i): 
       for y in range(r, r+i): 
        binList[x][y] = i 
      c += 1 
      if c > len(binList): 
       c = 0 
       r += 1 
       if r > len(binList): 
        return binList 
     else: 
      binList = falseChecker(binList, r, c, i) 

    return binList 

main() 
+3

@Everybody: Có bản sao chính thức cho chung hay không "Tôi đã viết một hàm đệ quy nhưng không trả về giá trị từ một trong các câu hỏi đệ quy"? – DSM

+2

Là một lưu ý phụ, 'if sCheck:' tốt hơn 'if sCheck == True:' trong hầu hết mọi tình huống (bao gồm cả tình huống này). – abarnert

+0

@abarnert "gần như"? Có * bất kỳ tình huống nào trong đó '== True' được ưu tiên không? – lvc

Trả lời

11

Trong trường hợp sCheck == True là sai, bạn không return bất kỳ thứ gì. Và trong Python, một hàm không rõ ràng là return bất kỳ thứ gì trả về None.

Nếu bạn đang cố gắng một cách đệ quy gọi mình và trả kết quả, bạn có muốn điều này:

return falseChecker(binList, r, c, size) 
3

Dòng đệ quy:

falseChecker(binList, r, c, size) 

cần phải được

return falseChecker(binList, r, c, size) 

hoặc chức năng đệ quy kết thúc, và hàm ngoài tiếp tục si nce nó chưa trở lại. Sau đó nó kết thúc mà không quay trở lại, và do đó trả về None.

2

Bạn cần một return vào cuối falseChecker:

def falseChecker(binList, r, c, size): 
    sCheck = isSpaceFree(binList, r, c, size) 
    if sCheck == True: 
     for x in range(c, c+size): 
      for y in range(r, r+size): 
       binList[x][y] = size 
     return binList 
    else: 
     c += 1 
     if c > len(binList): 
      c = 0 
      r += 1 
      if r > len(binList): 
       return binList 

     ################################# 
     return falseChecker(binList, r, c, size) 
     ################################# 

Trong Python, chức năng quay trở lại None theo mặc định nếu họ đến cuối của bản thân mà không quay trở lại. Hơn nữa, khi falseChecker chạy lần đầu tiên, nếu sCheckFalse, thì nó sẽ thực thi khối else. Khối mã này không chứa return. Bởi vì điều này, giá trị trả lại cuối cùng của falseChecker sẽ là None.

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