当前位置:首页 > 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
分享给朋友:

相关文章

jquery.js

jquery.js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,用于简化 HTML 文档遍历、事件处理、动画设计和 Ajax 交互。它的设计宗旨是“Write Less, Do Mor…

js实现

js实现

实现 JavaScript 功能的方法 在 JavaScript 中实现特定功能通常涉及多个步骤。以下是常见的实现方法: 基础语法和变量声明 使用 let 或 const 声明变量: let co…

js实现图

js实现图

JavaScript 实现图的常用方法 在 JavaScript 中,图(Graph)可以通过多种方式实现,常见的包括邻接表(Adjacency List)和邻接矩阵(Adjacency Matrix…

js实现密码

js实现密码

密码强度验证 使用正则表达式验证密码强度是一种常见方法。以下代码检查密码是否包含大小写字母、数字和特殊字符,且长度至少为8位: function checkPasswordStrength(pass…

js怎么实现异步

js怎么实现异步

异步实现方法 JavaScript中实现异步操作主要通过以下几种方式: Promise Promise是ES6引入的异步解决方案,用于处理异步操作的成功或失败状态。 const promise =…

js实现下拉刷新

js实现下拉刷新

监听触摸事件 通过监听 touchstart、touchmove 和 touchend 事件来检测用户下拉手势。记录触摸起始位置和移动距离。 let startY = 0; let currentY…