- 文档
- 教程
【免费下载链接】HowToCook
Programmer's guide about how to cook at home.
每天面对厨房和菜谱,最难的不是烹饪本身,而是"今天到底吃什么"。在 HowToCook 项目(README.md 中将其列为入门准备文档之一)中,这个问题被严肃对待:与其靠灵感随缘,不如用一条可复现的数学模型把"点菜"变成一次确定性的计算。本文以 如何选择现在吃什么 为核心骨架,完整推导荤素配比公式,并结合仓库数百道菜谱的目录分类,给出从"人数"到"具体菜品"的完整决策链路。
为什么需要形式化决策
做饭前的最大难题是选择吃什么。HowToCook 项目的核心理念是"用更清晰精准的描述来整理常见菜的做法"(见 README.md),它对菜谱格式本身也提出了严格约束:菜谱模板要求包含预估难度星级、卡路里、原料定量与可复现步骤(参考 示例菜)。决策吃什么同样遵循这一精神——用数学语言描述,把主观纠结变成约束求解。
计算荤菜和素菜数量
两条基本规则
决策的第一步是确定这一餐做几道菜,以及荤素配比:
- 菜的数量 = 人数 + 1。
- 荤菜比素菜多一个,或一样多即可。
由此得到荤菜数量和素菜数量,再在菜谱中选择即可。
形式语言描述
当有人数N时,设素菜数为a,荤菜数为b,N、a、b均为整数。此时有下列不等式组:
a + b = N + 1a ≤ b ≤ a + 1
方程组的第一条约束保证菜的总数与人数匹配(多出 1 道,兼顾丰盛度),第二条约束保证荤菜数量不高于素菜数量加 1、也不低于素菜数量,即荤菜要么与素菜持平、要么只多一道。
解得:
const a = Math.floor((N + 1) / 2); const b = Math.ceil((N + 1) / 2);Math.floor向下取整得到素菜数,Math.ceil向上取整得到荤菜数,两者恰好互补。代入几个典型值验证:1 人用餐时a=1, b=1(一荤一素共 2 道);2 人时a=1, b=2(一素两荤共 3 道);4 人时a=2, b=3(两素三荤共 5 道);8 人时a=4, b=5(四素五荤共 9 道)。可见随着人数增长,素菜与荤菜数量几乎同步增加,仅差 0~1 道,符合"荤菜比素菜多一个或一样多"的约束。
边界情况讨论
- 当
N+1为偶数(即人数为奇数)时,a = b,一桌菜荤素持平; - 当
N+1为奇数(即人数为偶数)时,b = a + 1,荤菜恰好多一道。
这个模型的本质是保证"荤素均衡且总量可控",避免出现一桌全是肉的失衡搭配。
菜的选择:从数量到具体菜品
得到荤素数量后,第二步是在 HowToCook 仓库的菜谱库中挑选具体菜品。仓库按目录对菜谱做了清晰的分类(见 README.md),正好与荤素决策衔接:
- 素菜目录 dishes/vegetable_dish:收录酸辣土豆丝、西红柿炒鸡蛋、蒜蓉西兰花等数十道快手素菜;
- 荤菜目录 dishes/meat_dish:收录小炒肉、红烧肉、宫保鸡丁等以猪、牛、羊、禽为主的菜肴;
- 水产目录 dishes/aquatic:收录清蒸鲈鱼、油焖大虾、小龙虾等鱼类与虾蟹类;
- 此外还有汤粥、主食、半成品加工等独立分类,可作为配菜与主食的补充。
在此基础上,原文档给出了几条经验性的选择约束:
- 如果人数超过 8 人,考虑在荤菜中增加鱼类荤菜(对应仓库 dishes/aquatic 分类,大型聚餐中鱼类兼具分量与仪式感);
- 如果有小孩,考虑增加有甜味的菜(可参考 糖醋排骨、糖醋里脊、拔丝土豆 等酸甜口菜品);
- 考虑增加特色菜、拿手菜(即自己最擅长的稳定发挥);
- 注意决策荤菜时不要全部使用同一种动物的肉,考虑顺序为:
猪肉、鸡肉、牛肉、羊肉、鸭肉、鱼肉; - 不要选择奇奇怪怪的动物做荤菜。
其中"荤菜动物多样性"约束在仓库分类中同样有迹可循:荤菜目录下猪肉类(小炒肉、红烧肉、糖醋排骨)、鸡肉类(宫保鸡丁、黄焖鸡、可乐鸡翅)、牛肉类(酱牛肉、黑椒牛柳)、羊肉类(萝卜炖羊排、煎烤羊排)、鸭肉类(啤酒鸭、血浆鸭)各自成菜,按顺序轮换即可保证餐桌肉类的多样化,也兼顾了采购与烹饪的常规性。
补充工具:仍然拿不准怎么办
如果完成上述计算与筛选后仍然拿不准,原文档建议使用 今天吃什么? 工具来选择。该工具在仓库 README.md 的"衍生作品推荐"中同样被收录,定位为"今天吃什么?的决策工具,帮助你快速选择合适的菜谱",可作为数学决策之外的随机兜底方案。
决策流程总结与扩展思考
完整的决策流程可以归纳为三步:
- 定量:由人数
N通过a = floor((N+1)/2)、b = ceil((N+1)/2)计算素菜数与荤菜数; - 定型:按人数、用餐对象(是否有小孩)、特色菜偏好等约束过滤候选菜;
- 定菜:荤菜按猪肉→鸡肉→牛肉→羊肉→鸭肉→鱼肉的顺序轮换,避免同质化,最终在 dishes/vegetable_dish、dishes/meat_dish、dishes/aquatic 等目录中落定具体菜谱。
值得注意的是,原文档的数学模型只约束了"数量与荤素比",并未对卡路里、烹饪时间、厨房现有原料做约束。HowToCook 的菜谱本身携带了预估烹饪难度、预估卡路里与定量原料信息(如 小炒肉 标注难度 ★★★ 与卡路里 2873 大卡,酸辣土豆丝 标注难度 ★★ 与卡路里 374 大卡),因此可以推断:当决策进入"同品类多选一"的环节时,结合这些元数据做二次筛选,是这一决策模型自然的外延——这也与本仓库"精准化、可复现"的整体风格保持一致。
最终,把"吃什么"从一道开放式主观题转化为"输入人数、输出菜谱清单"的确定性计算题,是这份文档对程序员群体最直接的贡献。
- 文档
- 教程
【免费下载链接】HowToCook
Programmer's guide about how to cook at home.
相关推荐
终极Windows文件管理器美化指南:3分钟打造个性化背景的简单教程
终极Windows文件管理器美化指南:3分钟打造个性化背景的简单教程 厌倦了Windows文件资源管理器千篇一律的单调界面吗?想要为日常文件操作增添一抹个性化色
桌面应用Anker Solix MQTT设备控制完全攻略:从配置到高级自动化
Anker Solix MQTT设备控制完全攻略:从配置到高级自动化 Anker Solix MQTT设备控制集成是Home Assistant平台上一款强大的
为什么你需要jQuery Tips Everyone Should Know:解决日常开发难题的黄金法则
为什么你需要jQuery Tips Everyone Should Know:解决日常开发难题的黄金法则 还在为jQuery开发中的常见问题烦恼吗?🤔 jQu
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考