【问题标题】:finding "indirect relationships" recursively递归地寻找“间接关系”
【发布时间】:2019-11-18 05:04:55
【问题描述】:

所以我有一个二维布尔数组 a,它应该代表不同人之间的关系/友谊。每个人都是通过他们的 id(数组的索引)来识别的,如果值a[1][0] 为真,则人 1 和 0 是朋友。如果 2 人是朋友,他们的“朋友距离”为 1。人们也可以通过其他人成为朋友,例如如果 a[1][0] = true, a[2][0] = true, a[2][1] = false,那么人 1 和 2 不是直接朋友,而是因为人 1 是人 0 的朋友,并且人 0 是人 2 的朋友,人 1 和人 2 是距离 2 的朋友。现在我想递归地确定,如果 2 人是给定距离内的朋友,或者他们不是。我已经写了这段代码:

public static boolean areFriends(int id0, int id1, int e) {
        if (e <= 0) {
            return false;
        }
        if (array[id0][id1]) {
            return true;
        }
        for (int i = 0; i < array.length; i++) {
            if (array[id0][i]){
                (areFriends(i, id1, --e);
            }
        }
        return false;
    }
}

代码至少应该做的是遍历 id0s 好友列表,并检查每个数组条目,如果 id0 和被检查的人 idx 是好友。如果是,则重复该方法,用 idx 替换 id0s 位置,以及 --e。因此,再次检查所有 idxs 关系,如果 idx 是另一个人的朋友,则整个循环会重复,直到“朋友距离”e 太高(因此不存在间接友谊)或找到间接友谊。

但显然这段代码并没有完全做到这一点,所以我会为我做错了什么或如何解决我的错误提供任何提示。

【问题讨论】:

    标签: java recursion


    【解决方案1】:

    最好将您的数据表示为图形,然后使用 Dijikstra 算法查找两个节点之间的路径。事实上,每个人都由一个节点表示,两个节点之间的弧线调节了友谊关系。

    使用您的数据模块,我建议作为解决方案:

    public static boolean areFriends(boolean friends[][], int id1, int id2, int distance) {
        if (friends[id1][id2]) {
            return true;
        }
    
        if (distance == 0) {
            return freinds[id1][id2];
        }
    
        for (int i = 0; i < friends[id1].length; i++) {
            if (i != id1 && friends[id1][i] && areFriends(friends, i, id2, distance - 1)) {
                return true;
            }
        }
    
        return false;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-02
      • 1970-01-01
      • 2019-05-28
      • 1970-01-01
      • 2014-04-02
      • 1970-01-01
      • 1970-01-01
      • 2014-04-29
      相关资源
      最近更新 更多