要求されたことを達成できなかったことを報告する "Pythonic" の方法は、例外を発生させることです。これにより、コードがかなり単純になります。
def removeRec(node, value):
if isinstance(node, EmptyNode):
raise ValueError("Cannot remove value from an empty list")
elif node.data == value:
return node.next
else:
node.next = removeRec(node.next, value)
return node
これは既存のremove
関数で機能し、呼び出し元のコードで例外を処理するのは呼び出し元に任せます。remove
ただし、関数が成功または失敗を示すブール値を返すようにしたい場合は、そこで例外をキャッチできます。
def remove(lst, value):
try:
lst.head = removeRec(lst.head, value)
return True # only reached if no exception was raised by the recursion
except ValueError:
return False
なんらかの理由 (まだ教えられていないクラスにいるなど) で例外の使用に反対している場合は、再帰呼び出しからの戻り値で削除の失敗をエンコードできますが、その場合はリストの損傷を避けるために、追加のチェックを行うには:
def removeRec(node, value):
if isinstance(node, EmptyNode):
print("Cannot remove value from an empty list")
return None # your code did this implicitly, I'm being explicit
elif node.data == value:
return node.next
else:
rec_result = removeRec(node.next, value)
if rec_result is None:
return rec_result
else:
node.next = rec_result
return node
次に、非再帰関数の再帰ケースから同じチェックを行い、結果の値をブール値に変換できます。
def remove(lst, value):
rec_result = removeRec(lst.head, value)
if rec_result is None:
return False
else:
lst.head = rec_result
return True