当前位置:首页 > JavaScript

js实现折纸问题

2026-02-02 20:46:03JavaScript

折纸问题简介

折纸问题通常指通过编程模拟纸张折叠的过程,计算折叠后的层数或方向。常见的折纸问题包括计算折叠n次后的折痕方向序列(如山谷折或山折)。

方法一:递归生成折痕序列

递归方法可以模拟每次折叠后折痕的变化规律。每次折叠后,新的折痕序列是在原有序列中间插入一个“山折”,并在两侧对称复制原有序列的逆序。

js实现折纸问题

function foldPaper(n) {
    if (n === 0) return [];
    const prev = foldPaper(n - 1);
    return [...prev, '山', ...prev.reverse().map(d => d === '山' ? '谷' : '山')];
}

// 示例:折叠3次
console.log(foldPaper(3)); // ["山", "山", "谷", "山", "山", "谷", "谷"]

方法二:迭代生成折痕序列

迭代方法通过循环逐步构建折痕序列,适合较大的n值以避免递归栈溢出。

js实现折纸问题

function foldPaperIterative(n) {
    let sequence = [];
    for (let i = 0; i < n; i++) {
        const newSequence = [...sequence, '山', ...sequence.map(d => d === '山' ? '谷' : '山').reverse()];
        sequence = newSequence;
    }
    return sequence;
}

// 示例:折叠2次
console.log(foldPaperIterative(2)); // ["山", "山", "谷"]

方法三:二进制位运算

折痕序列的规律与二进制表示有关。奇数位置为“山”,偶数位置为“谷”,具体方向可通过位运算判断。

function foldPaperBinary(n) {
    const totalFolds = Math.pow(2, n) - 1;
    const result = [];
    for (let i = 1; i <= totalFolds; i++) {
        result.push((i & (i - 1)) === 0 ? '山' : '谷');
    }
    return result;
}

// 示例:折叠1次
console.log(foldPaperBinary(1)); // ["山"]

方法四:二叉树中序遍历

折痕序列可以看作二叉树的中序遍历结果,左子节点为“谷”,右子节点为“山”。

function buildTree(height, direction) {
    if (height === 0) return null;
    const node = { direction };
    node.left = buildTree(height - 1, '谷');
    node.right = buildTree(height - 1, '山');
    return node;
}

function inOrderTraversal(node, result) {
    if (!node) return;
    inOrderTraversal(node.left, result);
    result.push(node.direction);
    inOrderTraversal(node.right, result);
}

function foldPaperTree(n) {
    const root = buildTree(n, '山');
    const result = [];
    inOrderTraversal(root, result);
    return result;
}

// 示例:折叠2次
console.log(foldPaperTree(2)); // ["谷", "山", "谷"]

注意事项

  1. 递归深度限制:递归方法在n较大时可能导致栈溢出,建议使用迭代方法。
  2. 性能优化:二进制位运算方法在n较大时效率较高。
  3. 方向定义:需明确“山折”和“谷折”的定义,不同问题中可能相反。

标签: 问题js
分享给朋友:

相关文章

js实现轮播

js实现轮播

实现轮播图的基本思路 轮播图的核心逻辑是通过定时切换展示的图片或内容,通常结合左右滑动按钮和指示器(小圆点)增强交互性。以下是基于原生JavaScript的实现方法。 HTML结构 构建轮播图的HT…

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div c…

js实现复制功能

js实现复制功能

使用 document.execCommand 方法 这种方法适用于较旧的浏览器,但在现代浏览器中可能被逐步淘汰。通过创建一个临时的 textarea 元素,将文本内容放入其中,然后执行复制命令。…

js 实现链表

js 实现链表

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。与数组不同,链表在内存中是非连续存储的,插入和删除操作效率较高。 链表的实现 在 JavaScri…

jquery js

jquery js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够更高…

js实现点击显示和隐藏

js实现点击显示和隐藏

实现点击显示和隐藏的JavaScript方法 使用classList.toggle切换类名 通过添加/移除CSS类控制元素的显示与隐藏,需提前在CSS中定义隐藏样式(如display: none)。…