Python栈递归排序:类内sort_s方法调用出现NameError的解决办法
解决栈排序递归方法的NameError问题
你遇到的NameError核心原因是:sort_s是Stack类的实例方法,不是全局函数,不能直接在类外部调用sort_s(test);同时方法内部的递归调用也未正确使用实例方法语法。完全可以把排序方法保留在类内,只需要修正调用逻辑和递归实现,以下是具体方案:
修正后的完整代码
# Sort a stack using recursion class Stack: def __init__(self, arr=[]): self.stack = [] for ele in arr: self.stack.append(ele) def __len__(self): return len(self.stack) def __str__(self): res = '' for each in self.stack: res += str(each) + ' ' return res def get_stack(self): return self.stack def push(self, number): self.stack.append(number) def pop(self): ele = self.stack[-1] self.stack.pop() return ele def tail(self): tail = self.stack[-1] print(tail) def sort_s(self): if len(self.stack) <= 1: # Base Condition: 栈长度<=1时无需排序 return temp = self.pop() # Hypothesis: 弹出栈顶,假设剩余栈可被排序 self.sort_s() # 递归排序剩余栈 self.ordered_insert(temp) # Induction: 将弹出元素插入有序栈的正确位置 def ordered_insert(self, temp): # 边界处理:栈为空直接压入 if not self.stack: self.push(temp) return # 若栈顶元素小于等于temp,直接压入 if self.stack[-1] <= temp: self.push(temp) return # 否则弹出栈顶,递归找到合适位置后再放回 top = self.pop() self.ordered_insert(temp) self.push(top) if __name__ == '__main__': test = Stack([0, 5, 1]) print(test) test.tail() test.push(3) y = test.pop() print(f'{10+y}') print(test) test.push(6) test.push(9) test.push(8) # 调用实例的sort_s方法 test.sort_s() print(test)
关键修改说明
- 外部调用修正:类外部通过实例调用方法,用
test.sort_s()替代sort_s(test) - 递归调用修正:
sort_s内部用self.sort_s()实现递归,不再传递额外参数,直接操作当前实例的栈 ordered_insert逻辑优化:改用递归实现(更贴合IBH递归思路),同时处理了栈为空、temp大于所有元素等边界情况- 方法职责简化:
sort_s不再返回栈,直接修改当前实例的self.stack,符合面向对象设计逻辑
内容的提问来源于stack exchange,提问作者Areeb Hussain Qureshi
相关产品推荐
相关产品推荐

