Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
339 views
in Technique[技术] by (71.8m points)

python - method() takes 1 positional argument, but 4 were given?

So this is my code, that uses recursion to solve the Tower of Hanoi, and this error comes up whenever I try to run solve(). The other function works fine (I've tested it), and all of my methods contain self. I haven't found any similar error on SO, that don't have to do with someone forgetting self. So, why's this going wrong?

class RODS():
       pass 


class HANOI():

  def __init__(self,rings,start,end):
    self.rings=rings
    self.start=start
    self.end=end
    self.rods=RODS()
    for i in range(rings):
     setattr(self.rods,"rod"+str(i+1),[])
    self.rods.rod1=[1,2,3]
  
  def solve(self):
   if self.rings == 1:self.pm(self.start,self.end)
   else:
    other=6-(self.start+self.end)
    self.solve(self.rings-1,self.start,other)
    self.pm(self.start,self.end)
    self.solve(self.rings-1,other,self.end)

  def pm(self,start,end):
   rod=getattr(self.rods,"rod"+str(start+1))
   ring=rod[0]
   end_rod=getattr(self.rods,"rod"+str(end+1))
   end_rod.append(ring)
   rod.remove(ring)
   print("Ring:",ring,"-> Rod:",end)

  

hanoi=HANOI(3,1,3)
hanoi.solve()

This is the error:

    Traceback (most recent call last):
  File "main.py", line 35, in <module>
    hanoi.solve()
  File "main.py", line 20, in solve
    self.solve(self.rings-1,self.start,other)
TypeError: solve() takes 1 positional argument but 4 were given
question from:https://stackoverflow.com/questions/65892481/method-takes-1-positional-argument-but-4-were-given

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

You need parameters for solve, but you probably are OK with default values for the top-level call:

def solve(self, start=1, stop=3, other=2):
   if self.rings == 1:
       self.pm(self.start, self.end)
   else:
       other = 6 - (self.start + self.end)
       self.solve(self.rings-1, self.start, other)
       self.pm(self.start, self.end)
       self.solve(self.rings-1, other, self.end)

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...