首页 文章

使用D中的指针实现递归函数

提问于
浏览
2

我目前正在尝试实现一个递归函数,从一个数字列表构建一个树 . 我目前有这个:

Node makelist(Integer[] nums) {
  if (nums.length == 1) {
    return Node(nums[0]);
  } else {
    Integer half = nums.length/2;
    return Node(makelist(nums[0..half]), makelist(nums[half..$]));
  }
}

这对我来说很好,而 Node 是一个对象 . 但是,我想 Node 是一个结构 . 结果,我为 Node 编写了以下代码:

struct Node {
  Node* left, right, parent;
  Integer val;

  this(Integer val) {
    this.val = val;
  }

  this(Node* left, Node* right) {
    this.left = left;
    this.right = right;
    val = min(left.val, right.val);
    left.parent = &this;
    right.parent = &this;
  }
}

现在,编译器显然不太喜欢这个 . 但是,我不知道如何获取 makelist 返回的地址,以使构造函数的参数成为指针 . 基本上,我想要传递 ref Node s作为 leftright (但编译器也在这里婊子)或指针(但我似乎无法使这些工作) .

我是低级代码的新手,并希望得到一些帮助,让它工作 . 基本上,我想使用上面描述的递归 makelist ,并且有 Node 的两个构造函数 . 我怎么能这样做并保持 Node 结构?

2 回答

  • 4

    我不确定你到底想要什么,但是这个怎么样:

    import std.stdio;
    import std.algorithm;
    
    alias Integer = size_t;
    
    alias Node = _Node*;
    
    struct _Node {
        Node left, right, parent;
        Integer val;
    
        this(Integer val) {
            this.val = val;
        }
    
        this(Node left, Node right) {
            this.left = left;
            this.right = right;
            val = min(left.val, right.val);
            left.parent = &this;
            right.parent = &this;
        }
    }
    
    Node makelist(Integer[] nums) {
        if (nums.length == 1) {
            return new _Node(nums[0]);
        } else {
            Integer half = nums.length/2;
            return new _Node(makelist(nums[0..half]), makelist(nums[half..$]));
        }
    }
    
  • 2

    另一种方法是使用 alias this

    import std.stdio;
    import std.algorithm;
    import core.stdc.string;
    
    alias Integer = size_t;
    
    struct Node {
        alias me this;
        @property Node* me() {
            Node* n = new Node();
            memcpy(cast(void*)n, cast(void*)&this, this.sizeof);
            return n;
        }
    
        Node * left, right, parent;
        Integer val;
    
        this(Integer val) {
            this.val = val;
        }
    
        this(Node left, Node right) {
            this.left = left;
            this.right = right;
            val = min(left.val, right.val);
            left.parent = right.parent = &this;
        }
    }
    
    Node makelist(Integer[] nums) {
        if (nums.length == 1) {
            return Node(nums[0]);
        } else {
            Integer half = nums.length/2;
            return Node(makelist(nums[0..half]), makelist(nums[half..$]));
        }
    }
    

相关问题