\documentclass[实验报告模板]{subfiles} \renewcommand{\mydate}{ 2023/10/10 } \renewcommand{\mychapternum}{2} \begin{document} \mytitle \begin{enumerate} \myitem{实验目的}{ \item 使用第二章知识解决约瑟夫环问题(复杂版)。 } \myitem{实验内容}{ \item 在原有约瑟夫环的基础上,输入参与这场游戏的人数 n 与自杀报数 m, 输出为最后两个幸存者的位置序号。 \item 在第一题的基础上,输入参与这场游戏的人数 n 与两个自杀报数 a 和 b,按照一次 a 一次 b 的顺序自杀(a,b 可以为负数,正数代表正向, 负数代表反向),输出为最后两个幸存者的位置序号。 } \myitem{实验原理}{ \item 程序设计原理。 } \myitem{实验步骤}{ \item 问题抽象 \item 编写程序 \item 调试程序 \item 完善总结 } \myitem{调试过程、结果和分析}{ \item 简单考虑,暂时不考虑输入错误或者输入为0的情况; \item JavaScript没有指针的概念,所以使用对象的引用代替; \item JavaScript在严格模式下暂时无法直接删除对象,因此移除结点时无法完全销毁一个节点; \item 最后只留下两个,而不是$\min(\mathrm{abs}(a), \mathrm{abs}(b))-1$个; \item 删除的结点应该作为第0个,此时往前a个或往后b个,一开始如果a是正数那么应该按照$1, 2, 3, \ldots $的顺序遍历,如果a是负数那么应该按照$n, n-1, n-2, \ldots $的顺序遍历; \item 由于此问题中只涉及到初始化链表、删除单个结点两个操作,因此链表的添加结点、清空、销毁等操作暂不需要实现。 } \myitem{总结}{ \item 由于JavaScript的异步性质,需要进行连续多个输入时,可以将回调过程封装成Promise对象后,使用async创建异步函数,在其中使用await可以方便使用Promise对象,避免大量回调,同时也可以结合循环、分支等结构,实现更复杂的控制; \item 抽象出了结点对象和链表对象,并且实现了从当前节点开始寻找第n个结点(可以为负数)的方法; \item 整个文件中只有input和main\_函数与Node.js环境耦合,即使用了readline模块,而主要功能放在main函数中,因此在浏览器环境中可以直接调用main函数,方便代码复用。 } \myitem{附件}{ \itemsep 3em \item 在原有约瑟夫环的基础上,输入参与这场游戏的人数 n 与自杀报数 m, 输出为最后两个幸存者的位置序号。\\ (JavaScript,Node.js环境) \inputminted[linenos=true,breaklines=true]{javascript}{../JavaScript/第二章作业1.js} \item 在第一题的基础上,输入参与这场游戏的人数 n 与两个自杀报数 a 和 b,按照一次 a 一次 b 的顺序自杀(a,b 可以为负数,正数代表正向, 负数代表反向),输出为最后两个幸存者的位置序号。\\ (JavaScript,Node.js环境) \inputminted[linenos=true,breaklines=true]{javascript}{../JavaScript/第二章作业2.js} } \end{enumerate} \end{document}