【问题标题】:Memory using lists - Homework使用列表记忆 - 作业
【发布时间】:2012-02-03 22:16:54
【问题描述】:

所以基本上我在这个作业中遇到问题 5,http://www.student.cs.uwaterloo.ca/~cs136/assignments/a5/

我们基本上得到了类似于 Scheme 列表函数的函数,在问题 5 中,我应该创建一个名为 iappend 的函数,它附加两个列表。这是我的代码,它似乎可以工作。

ilist iappend(ilist il1, ilist il2) {
    ilist acc = iempty();
    ilist acc1 = iempty();
    ilist a;
    while (!iempty_huh(il1)) {
        acc1 = icons(ifirst(il1), acc1);
        il1 = irest(il1);
    }
    while (!iempty_huh(il2)) {
        acc1 = icons(ifirst(il2), acc1);
        il2 = irest(il2);
    }
    a = acc1;
    while (!iempty_huh(acc1)) {
        acc = icons(ifirst(acc1), acc);
        acc1 = irest(acc1);
    }
    idelete(a);
    return acc;
}

新问题,有人可以帮我写代码,所以我不会做一个临时列表吗?我需要以不使用 idelete 的方式对其进行编码....任何建议都会有所帮助:)

【问题讨论】:

  • 我认为它仍然是 O(n),但它当然可以做得更快 O(n)。您正在对列表进行固定次数的传递,并且您需要至少对至少 ONE 列表进行一次传递。
  • 我不知道我明白什么,“至少 ONE 超过至少一个列表”是什么意思?

标签: c list memory scheme


【解决方案1】:

本质上,您将通过使用辅助列表作为堆栈来模仿递归解决方案,并且您有这个想法。 但为了更有效率,试试这个。首先制作第一个列表的反向副本,只需一个简单的 while-not-empty 循环。然后继续使用第二个列表扩展该反向副本,再次使用简单的 while-not-empty 循环。现在您有一个附加在一起的两个列表的反向副本: (reverse second)||(reverse first);使用另一个 while-not-empty 循环制作一个反向的反向(即正确的顺序)副本。您应该能够在没有任何“if”测试的情况下执行此操作——while 循环应该正确处理空列表的极端情况。

另外,不要删除参数——那是自找麻烦。但当然要删除前两个循环制作并由第三个循环使用的反向副本;它本质上是递归版本的堆栈。

【讨论】:

  • 当我有第二个反转的列表时,我不应该也制作第一个的反转副本,然后继续扩展反转的副本吗?
  • 我已经解释了这个: ilist iappend(ilist il1, ilist il2){ ilist acc = iempty(); ilist acc1 = iempty(); ilist a; while(!iempty_huh(il1)){ acc1 = 图标(ifirst(il1),acc1); il1 = irest(il1); } while(!iempty_huh(il2)){ acc1 = 图标(ifirst(il2),acc1); il2 = irest(il2); } a = acc1; while(!iempty_huh(acc1)){ acc = 图标(ifirst(acc1), acc); acc1 = irest(acc1); } idelete(a);返回acc; }
  • 它似乎并没有继续将反向的第二个列表累积到它上面吗?
【解决方案2】:

两个提示:(pop, push),一个循环

附加提示

如果 iList 是 { item, next_iList_ptr } 的结构,您可以复制您的值并指向下一个节点以进行列表中的下一次迭代。第一个完成后切换到第二个。

【讨论】:

  • 一个循环听起来很有趣。但我不太了解推送和弹出?
  • 您似乎正在处理一个单链表。您只能从头到尾遍历堆栈。所以追加是从 l1 弹出节点推入 l3,到达 l1 的末尾,弹出 l2 推入 l3,然后返回 l3。它可以在一个while循环中完成。从您的帖子中不清楚是否会更改 l1 或 l2。
  • 所以一个循环中的一个循环,但我不会还在制作一个临时列表吗?并且不应该更改 l1 和 l2(所以我假设制作一个临时列表),我们假设使用 l1 和 l2 制作一个新的“列表”
  • 我使用 if 和 else 语句组成了一个循环,但这仍然让我得到反向的原始列表?有没有办法编写没有临时列表的代码?
  • 如果我理解你的规则,你可以直接在iList节点上操作。没有必要,而且比使用 iempty-irest-icons 更有效。
【解决方案3】:

粗略地说:遍历第一个列表,制作副本,并记住副本的最后一个单元格;然后从中构建第二个列表的副本。

【讨论】:

  • 别以为他有rplacd,所以要双反。
  • 所以以相反的顺序保存第一个列表的副本(我假设因为我想记住最后一个单元格),当我构建第二个列表的副本时,我不应该累积两个列表吗一起。教授还说我不需要在我的函数中使用 idelete,所以我假设我只需要一个变量来存储输出列表......这就是我挣扎的地方
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-10
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
相关资源
最近更新 更多