当前位置: 首页 > 知识库问答 >
问题:

我有一个关于cs50中潮汐问题的问题

堵凯
2023-03-14

我在pset3(cs50)中做tideman问题,但是我不能区分我的程序和函数look_pairs的正确程序之间的区别。

:) tideman.c exists
:) tideman compiles
:) vote returns true when given name of candidate
:) vote returns false when given name of invalid candidate
:) vote correctly sets rank for first preference
:) vote correctly sets rank for all preferences
:) record_preferences correctly sets preferences for first voter
:) record_preferences correctly sets preferences for all voters
:) add_pairs generates correct pair count when no ties
:) add_pairs generates correct pair count when ties exist
:) add_pairs fills pairs array with winning pairs
:) add_pairs does not fill pairs array with losing pairs
:) sort_pairs sorts pairs of candidates by margin of victory
:) lock_pairs locks all pairs when no cycles
:( lock_pairs skips final pair if it creates cycle
    lock_pairs did not correctly lock all non-cyclical pairs
:) lock_pairs skips middle pair if it creates a cycle
:) print_winner prints winner of election when one candidate wins over all others
:) print_winner prints winner of election when some pairs are tied

这是我的程序,我在正确的程序之间做了一点区别。我没有判断makeCycle(winner,I)的返回,而是返回这个函数,你可以在我的代码中看到区别。

bool makeCycle(int winner, int loser) 
{
        if (winner == loser) {
            return true;
        }
        for (int i = 0; i < candidate_count; i ++) {
            if (locked[loser][i]) {
                    return makeCycle(winner, i); 
            }
        }
        return false;
}

// Lock pairs into the candidate graph in order, without creating cycles
void lock_pairs(void)
{
    // TODO
    for(int i = 0; i < candidate_count; i ++) {
        if (!makeCycle(pairs[i].winner, pairs[i].loser)) {
            locked[pairs[i].winner][pairs[i].loser] = true;
        }
    }
    return;
}

这是正确的版本,但我认为我的程序和正确的版本是一样的,我不知道为什么我的程序会造成这个错误。

bool makeCycle(int winner, int loser) 
{
        if (winner == loser) {
            return true;
        }
        for (int i = 0; i < candidate_count; i ++) {
            if (locked[loser][i]) {
                    if(makeCycle(winner, i)){
                        return true;
                    }
            }
        }
        return false;
}

// Lock pairs into the candidate graph in order, without creating cycles
void lock_pairs(void)
{
    // TODO
    for(int i = 0; i < candidate_count; i ++) {
        if (!makeCycle(pairs[i].winner, pairs[i].loser)) {
            locked[pairs[i].winner][pairs[i].loser] = true;
        }
    }
    return;
}```

共有2个答案

牟稳
2023-03-14

这两个版本并不相同。

这里:

if(makeCycle(winner, i)){
                        return true;
                    }

MakeCycle(..)返回false时,函数不返回。而在第一个版本中:

return makeCycle(winner, i); 

函数总是返回调用的结果。

也许你被误导了

if (condition) return true; else return false;

与…相同的

return condition;

但是

if (condition) return true;

不等于

return condition;

第一个版本在第一次迭代中返回,其中locked[loser][i]true。第二个版本仅在locked[loser][i]makecycle(...)均为true时返回,否则继续循环。

姬向明
2023-03-14

在您的程序中

    for (int i = 0; i < candidate_count; i ++) {
        if (locked[loser][i]) {
                return makeCycle(winner, i); 
        }
    }

返回false的频率比

    for (int i = 0; i < candidate_count; i ++) {
        if (locked[loser][i]) {
                if (makeCycle(winner, i)) {
                    return true;
                }
        }
    }
    return false;

这是因为在第二个解决方案中,如果makecycle(winner,i)失败,它不会返回false;它继续到下一个locked[loser][i]。如果所有锁定的[loser][i]无法触发对MakeCycle(winner,i)的成功调用,则正确的解决方案仅返回false。您的解决方案将返回第一个makecycle(winner,i)返回的内容。

 类似资料:
  • 为什么最后输出的是“WuffRingding”而不是“RingdingRingding”? 为什么最终输出是“颤动”而不是“振铃”?为什么最终输出是“颤动”而不是“振铃”?

  • 使用FIXED_WINDOW算法时,"validDuration","MaxAmount"参数是什么意思?

  • 为什么我会得到这个错误?为什么尽管导入了junit断言,我还是不能编写而是必须编写?为什么我不能使用mockito中的(message is不能解析'currencyexchange_logictest'中的方法'when')。是不是因为依赖关系,它们出了什么问题?

  • 上面是代码,想执行'person1.func3()'。 结果如下图

  • 我目前正在尝试用cubey地形制作一个基本游戏,类似于Minecraft classic。我的第一个问题: 如何在VBO中存储多维数据集列表,然后在更改该数据时重新生成该列表?我当前呈现的立方体如下所示: 我知道我需要使用和来修改VBO,但是如何存储多维数据集并在需要时删除它们?我应该使用ArrayList吗?另外,有人告诉我,我渲染立方体的方式是错误的,因为每个人都说我只渲染一个具有新坐标的立方

  • 我似乎不明白我的程序有什么问题。作业是CS50第二周习题集中的“替换”。目标是创建一个程序,在用户将26个字符的密钥键入argv[2]后,该程序将用户键入的文本转换为加密文本,在加密文本中,用密钥切换常规字母表。我的代码几乎可以完全正常工作,但是对于我想要加密的每个文本,有一两个字母(每次都会更改),输出是错误的。 e、 g/替换YUKFRNLBAVMWZteogxhcipjsqd 这里是CS50