如何将对象类的实例化为Python中的全局变量



我是启动器&想要将DFS代码与fibonacci系列生成代码集成。斐波那契代码也以DFS的形式运行,并从左到右进行呼叫。集成仍然不完整。

我有两个问题:
(i)无法在fib()中正确更新"路径",因为输出未正确描述。

(ii)在下面的fib()函数中说明,如注释。

P.S.

还有一个与程序工作有关的问题:

(iii)在修改行#16上to:stack = root = stack [1:];获得与以前相同的输出。

import sys
count = 0
root_counter = 0
#path=1
inf = -1
node_counter = 0
root =0
def get_depth_first_nodes(root):
    nodes = []
    stack = [root]
    while stack:
        cur_node = stack[0]
        stack = stack[1:]
        nodes.append(cur_node)        
        for child in cur_node.get_rev_children():
            stack.insert(0, child)
    return nodes
def node_counter_inc():
     global node_counter
     node_counter = node_counter + 1
class Node(object):
    def __init__(self, id_,path):
        self.id = node_counter_inc() 
        self.children = []
        self.val = inf #On instantiation, val = -1, filled bottom up; 
                       #except for leaf nodes
        self.path = path                
    def __repr__(self):
        return "Node: [%s]" % self.id     
    def add_child(self, node):
        self.children.append(node)     
    def get_children(self):
        return self.children        
    def get_rev_children(self):
        children = self.children[:]
        children.reverse()
        return children        
def fib(n, level, val, path):
    global count, root_counter, root
    print('count :', count, 'n:', n, 'dfs-path:', path)
    count += 1
    if n == 0 or n == 1:
        path = path+1
        root.add_child(Node(n, path))
        return n
    if root_counter == 0:
        root = Node(n, path)
        root_counter = 1
    else:
        #cur_node.add_child(Node(n, path)) -- discarded for next(new) line
        root.add_child(Node(n, path))   
    tmp = fib(n-1, level + 1,inf, path) + fib(n-2, level + 1,inf,path+1)
    #Issue 2: Need update node's val field with tmp.  
    #So, need suitable functions in Node() class for that.
    print('tmp:', tmp, 'level', level)
    return tmp
def test_depth_first_nodes():
     fib(n,0,-1,1)  
     node_list = get_depth_first_nodes(root)
     for node in node_list:
         print(str(node))
if __name__ == "__main__":
     n = int(input("Enter value of 'n': ")) 
     test_depth_first_nodes() 

想从这里添加代码的想法。

回答第一个问题:

在这个特定问题中的路径是一个。它是以贪婪的DFS方式从根到叶子的路径数量。

这可以通过让路径为全局变量而不是对FIB函数的输入来实现。每当我们到达叶子时,我们都会增加路径计数。

我还修改了FIB函数以返回节点而不是数字。

import sys
count = 0
root_counter = 0
path=1
inf = -1
node_counter = 0
root = None
def node_counter_inc():
     global node_counter
     node_counter = node_counter + 1
     print("node_counter:", node_counter)
     return node_counter   
class Node(object):
    def __init__(self, id__,path):
        print("calling node_counter_inc() for node:", n )
        try:
            self.id = int(node_counter_inc())
        except TypeError:
            self.id = 0  # or whatever you want to do
        #self.id = int(node_counter_inc())
        self.val = inf #On instantiation, val = -1, filled bottom up; 
                       #except for leaf nodes
        self.path = path
        self.left = None
        self.right = None
    def __repr__(self):
        return "Node" + str(self.id) + ":"+ str(self.val)          

def fib(n, level, val):
    # make fib returns a node rather than a value
    global count, root_counter, root, path
    print('count :', count, 'n:', n, 'dfs-path:', path)
    count += 1
    if n == 0 or n == 1:
        path = path+1
        new_Node = Node(n, path)
        new_Node.val = n
        return new_Node
        #root.add_child(new_Node)
    #    return new_node
    #if root_counter == 0:
    #   root = Node(n, path)
    #   root_counter = 1
    #else:
        #cur_node.add_child(Node(n, path)) -- discarded for next(new) line
    #    root.add_child(Node(n, path))   
    #tmp = fib(n-1, level + 1,inf) + fib(n-2, level + 1,inf)
    #Issue 2: Need update node's val field with tmp.  
    #So, need suitable functions in Node() class for that.
    #print('tmp:', tmp, 'level', level)
    #return tmp
    ans = Node(n, path)
    ans.left = fib(n-1, level + 1, inf)
    ans.right = fib(n-2, level + 1, inf)
    ans.val = ans.left.val + ans.right.val
    print("the node is", ans.id, "with left child", ans.left.id, "and right child", ans.right.id)
    print("the corresponding values are",  ans.val, ans.left.val, ans.right.val)
    return ans
def test_depth_first_nodes():
     ans = fib(n,0,-1)
     print("The answer is", ans.val)
     #node_list = get_depth_first_nodes(root)
     #for node in node_list:
     #    print(str(node))
if __name__ == "__main__":
     n = int(input("Enter value of 'n': ")) 
     test_depth_first_nodes() 

相关内容

  • 没有找到相关文章

最新更新