Ошибка типа: height_rb() принимает 2 позиционных аргумента, но было дано 3

#python #algorithm #data-structures

Вопрос:

Я хочу эмпирически показать, что красно-черное дерево имеет среднюю высоту logn.

Почему я получаю «Ошибка типа: height_rb() принимает 2 позиционных аргумента, но 3 были даны»?

     import numpy as np
    import pandas as pd
    from random import randint
    from time import perf_counter
    from matplotlib import pyplot as plt
    
    RED, BLACK = 'R', 'B'
    
    
    # Tnil necessary since code has reference assignments like y.right.p
    class Tn:
        def __init__(self):
            self.p = None
            self.color = BLACK
    
    
    Tnil = Tn()
    
    
    # All references are assigned to Tnil
    class RBNode:
        def __init__(self, value):
            self.value = value
            self.left = Tnil
            self.right = Tnil
            self.p = None
            self.color = None
            self.height = None
    
    
    def height_rb(self, node):
        if node is None:
            return -1
        return max(self.height_rb(node.left), self.height_rb(node.right))   1
    
    
    # For measuring insertion cost of Red-Black tree
    def new_rb_val(_n):  # So there will be collisions
        return randint(0, _n / 10), randint(0, _n)
    
    
    # Empirical Time Complexity
    def measure_cost(n_runs, height_f, node_f):
        ds = None
        t = []
        for n in n_runs:
            runs = []
            for j in range(10):  # reduce the variation of the measurement
                ds = None  # starting from an empty data structure
                st = perf_counter()
                for i in range(n):
                    ds = height_f(ds, *node_f(n))
                runs  = [perf_counter() - st]
    
            t  = [np.mean(runs)]
    
        print('clock: ', ' '.join(['{:g}'.format(v) for v in t]))
        # ds dataset can be used for search
        return t, ds
    
    
    N_RUNS = [10, 100, 500, 700, 1000, 2000, 3000, 5000, 7000, 9000, 10000]
    
    t, ds = measure_cost(N_RUNS, height_rb, new_rb_val)
    
Error:

    TypeError: height_rb() takes 2 positional arguments but 3 were given
 

Ответ №1:

Полный маршрут (который вы не предоставили) :

 Traceback (most recent call last):
  File "C:/PycharmProjects/stack_overflow/68002339.py", line 64, in <module>
    t, ds = measure_cost(N_RUNS, height_rb, new_rb_val)
  File "C:/PycharmProjects/stack_overflow/68002339.py", line 52, in measure_cost
    ds = height_f(ds, *node_f(n))
TypeError: height_rb() takes 2 positional arguments but 3 were given
 

Ты звонишь measure_cost(N_RUNS, height_rb, new_rb_val) .
На линии ds = height_f(ds, *node_f(n)) есть , height_f height_rb и вы называете это (None, 0, 10) «потому node_f(n) (0, 10) что».
Так что действительно вы звоните height_rb() с тремя параметрами.

Это ваша ошибка, теперь вам нужно найти, как ее исправить.