Hướng dẫn recursive function return none python - hàm đệ quy trả về không có python

Mặc dù tôi nghĩ rằng Martijn Pieters trả lời giải quyết vấn đề chính trong câu trả lời của anh ấy (bạn cần quay lại từ trường hợp đệ quy), tôi không nghĩ rằng mã được đề xuất của anh ấy sẽ hoạt động đúng.

Bạn đang cố gắng thực hiện một tìm kiếm chiều sâu đầu tiên cho giá trị

>>> directory = {"a": "a info",
                 "b": {"c": "b/c info", "d": "b/d info"},
                 "e": {"f": "e/f info", "g": {"h": "e/g/h info"}}}
>>> print(get_path(directory, "h"))
e\g\h
>>> print(get_path(directory, r'g\h'))
e\g\h
0 trong
>>> directory = {"a": "a info",
                 "b": {"c": "b/c info", "d": "b/d info"},
                 "e": {"f": "e/f info", "g": {"h": "e/g/h info"}}}
>>> print(get_path(directory, "h"))
e\g\h
>>> print(get_path(directory, r'g\h'))
e\g\h
1 Dict lồng nhau. Nhưng mã hiện tại của bạn không xử lý chính xác trường hợp đệ quy. Nó cần phải trả lời một cách thích hợp nếu kết quả được tìm thấy trong một trong các cuộc gọi đệ quy của nó hoặc nếu cuộc gọi đệ quy không tìm thấy mục tiêu.

Đây là những gì tôi nghĩ bạn cần, với một số điều được đổi tên hoặc sắp xếp lại cho sự rõ ràng:

def get_path(directory, rqfile, prefix=[]):
    for filename, value in directory.items():
        path_list = prefix + [filename]
        if not isinstance(value, dict): # base case
            path = os.path.join(*path_list)
            if rqfile in path:   # Found the file. Do you want to do something
                return path      # with the value here, or is it junk?

        else: # recursive case
            try:
                return get_path(value, rqfile, path_list) # this only returns if 
            except ValueError:                     # the recursion doesn't raise
                pass

    raise ValueError("Requested file not found") # not found here or in children

Ví dụ sử dụng:

>>> directory = {"a": "a info",
                 "b": {"c": "b/c info", "d": "b/d info"},
                 "e": {"f": "e/f info", "g": {"h": "e/g/h info"}}}
>>> print(get_path(directory, "h"))
e\g\h
>>> print(get_path(directory, r'g\h'))
e\g\h

Nếu bạn không muốn tăng các ngoại lệ khi không tìm thấy tệp, bạn cũng có thể trả về giá trị sentinel như

>>> directory = {"a": "a info",
                 "b": {"c": "b/c info", "d": "b/d info"},
                 "e": {"f": "e/f info", "g": {"h": "e/g/h info"}}}
>>> print(get_path(directory, "h"))
e\g\h
>>> print(get_path(directory, r'g\h'))
e\g\h
2 thay cho dòng cuối cùng và kiểm tra giá trị sentinel trong trường hợp đệ quy thay vì ________ 13/________ 14:

 result = get_path(value, rqfile, path)
 if result is not None:
     return result

Câu trả lời được đề xuất

Nhìn vào chức năng của bạn, khi độ sâu> 0, nó thực thi hàm (độ sâu -1), nhưng nó không trả về không có gì (do đó không có). Bạn phải viết

def function(depth):
    if depth > 0:
        return function(depth - 1)
    else:
        return 10

function(5)

Nhảy để đăng

Bạn phải trả về giá trị từ hàm đệ quy.

def function(depth):
    if depth > 0:
        return function(depth - 1)
    else:
        return 10

function(5)

EDIT: Xin lỗi, đã kiểm tra nó trong khi nó đã được trả lời.

Nhảy để đăng

Bạn phải trả về giá trị từ hàm đệ quy.

Hướng dẫn recursive function return none python - hàm đệ quy trả về không có python

EDIT: Xin lỗi, đã kiểm tra nó trong khi nó đã được trả lời. 1,391 Programming Explorer Team Colleague

Tất cả 5 câu trả lời

Nhìn vào chức năng của bạn, khi độ sâu> 0, nó thực thi hàm (độ sâu -1), nhưng nó không trả về không có gì (do đó không có). Bạn phải viết

def function(depth):
    if depth > 0:
        return function(depth - 1)
    else:
        return 10

function(5)

Hướng dẫn recursive function return none python - hàm đệ quy trả về không có python

Tất cả 5 câu trả lời

Bạn phải trả về giá trị từ hàm đệ quy.

def function(depth):
    if depth > 0:
        return function(depth - 1)
    else:
        return 10

function(5)

EDIT: Xin lỗi, đã kiểm tra nó trong khi nó đã được trả lời.

Tất cả 5 câu trả lời

Hướng dẫn recursive function return none python - hàm đệ quy trả về không có python

Tất cả 5 câu trả lời

GRIBOUILLIS1.391 LUẬT SƯ

Hướng dẫn recursive function return none python - hàm đệ quy trả về không có python

Tất cả 5 câu trả lời

GRIBOUILLIS1.391 LUẬT SƯ

def func(depth):
    if depth > 0:
        return function(depth - 1)
    else:
        return 10

12 năm trước

func(5) returns func(4)
  func(4) returns func(3)
    func(3) returns func(2)
      func(2) returns func(1)
        func(1) returns func(0)
          func(0) ... takes the other branch of the depth test ... returns 10

Đã chỉnh sửa 12 năm trước bởi beat_slayer vì: n/a

Cảm ơn, nó đã làm việc. Bây giờ tôi đang cố gắng để hiểu tại sao nó lại xảy ra. Có phải vì lần đầu tiên nó thực thi hàm (), không có câu lệnh trả về để nó hoàn thành thực thi hàm và trả về giá trị trả về mặc định của không?

def factorial(num):
  try:
     assert num == int(num)
  except (AssertionError, ValueError):
     print ("You must pass an integer parameter")
     return None
  if num < 0:
    return 0 - factorial(-num)
  # We know num >= 0 here
  if num <= 1:
    return num
  return num * factorial(num-1)

print ("%d: %d"%(3,factorial(3)))
print ("%d: %d"%(-4,factorial(-4)))
print ("%s: %s"%("moo",factorial("moo")))
print ("%s: %s"%(1.5,factorial(1.5)))

Bạn chỉ cần xem mã: Khi bạn gọi hàm, đối số được truyền lại là gì? Bạn có thể nghĩ về mỗi lời cầu khẩn (dù được gọi từ 'bên ngoài' hoặc từ 'bên trong') như một chức năng riêng biệt. Đây là chức năng:

Hướng dẫn recursive function return none python - hàm đệ quy trả về không có python

Vì vậy, chuỗi gọi trông giống như

Vì vậy, bạn có thể thấy rằng đối với chức năng này, bạn luôn nhận được 10 bất kể đối số không âm nào bạn chuyển đến.

Các chức năng đệ quy thú vị hơn làm một cái gì đó ... thú vị hơn. Ví dụ, một trong các chức năng đệ quy chính tắc là Factorial:

Tại sao một hàm đệ quy trở lại không?

OP có chức năng đệ quy, trong đó các cuộc gọi đệ quy bỏ lỡ sự trở lại.Do đó, nó đánh giá là không ai bất cứ khi nào nó đệ quy.the recursive calls misses a return . It thus evaluates to None whenever it recurses.

Tại sao chức năng Python của tôi không trả lại?

Nguồn phổ biến nhất của không có giá trị là: có một hàm không trả về bất cứ điều gì (trả về không ngầm định).Cài đặt rõ ràng một biến thành không.Gán một biến cho kết quả gọi chức năng tích hợp không trả về bất cứ điều gì.Having a function that doesn't return anything (returns None implicitly). Explicitly setting a variable to None . Assigning a variable to the result of calling a built-in function that doesn't return anything.

Bạn có thể làm đệ quy mà không trở lại?

Trong trường hợp đệ quy, người gọi ngay lập tức này có thể là một lời cầu khẩn khác của cùng chức năng đó.Trong hầu hết các ngôn ngữ, nếu bạn không sử dụng giá trị trả về của hàm bạn gọi là (đệ quy hay không), hoặc giá trị trả về đó sẽ bị loại bỏ hoặc đó là một lỗi có thể chẩn đoán được.if you don't use the return value of a function you called (recursively or not), either that return value gets discarded or it is a diagnosable error.

Làm thế nào để bạn dừng một chức năng đệ quy trong Python?

Một cách để thoát ra khỏi một chức năng đệ quy trong Python là ném một ngoại lệ và bắt được điều đó ở cấp cao nhất.Một số người sẽ nói rằng đây không phải là cách đúng đắn để suy nghĩ về đệ quy, nhưng nó hoàn thành công việc.throw an exception and catch that at the top level. Some people will say that this is not the right way to think about recursion, but it gets the job done.