惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

雷峰网
雷峰网
S
Securelist
Y
Y Combinator Blog
云风的 BLOG
云风的 BLOG
A
About on SuperTechFans
Martin Fowler
Martin Fowler
量子位
D
Docker
G
Google Developers Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
U
Unit 42
S
Secure Thoughts
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
K
Kaspersky official blog
NISL@THU
NISL@THU
T
Tailwind CSS Blog
I
Intezer
T
Threat Research - Cisco Blogs
P
Privacy & Cybersecurity Law Blog
D
DataBreaches.Net
Engineering at Meta
Engineering at Meta
C
Cyber Attacks, Cyber Crime and Cyber Security
F
Full Disclosure
Microsoft Security Blog
Microsoft Security Blog
Cisco Talos Blog
Cisco Talos Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Simon Willison's Weblog
Simon Willison's Weblog
Vercel News
Vercel News
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
F
Fortinet All Blogs
W
WeLiveSecurity
C
Cisco Blogs
Security Latest
Security Latest
PCI Perspectives
PCI Perspectives
L
LangChain Blog
P
Palo Alto Networks Blog
IT之家
IT之家
aimingoo的专栏
aimingoo的专栏
Apple Machine Learning Research
Apple Machine Learning Research
宝玉的分享
宝玉的分享
Blog — PlanetScale
Blog — PlanetScale
Help Net Security
Help Net Security
Microsoft Azure Blog
Microsoft Azure Blog
Project Zero
Project Zero
G
GRAHAM CLULEY
Recent Commits to openclaw:main
Recent Commits to openclaw:main
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
L
Lohrmann on Cybersecurity
Cloudbric
Cloudbric
D
Darknet – Hacking Tools, Hacker News & Cyber Security

明明如月成长笔记

个人数据的开源备份:从明清档案之殇想到的 简体字的双重优势:打字效率与扫盲成效全解析 四小时深圳书城奇遇:那些藏在书架间的偶然与必然 正式把我的笔记系统迁移到 Obsidian,为了和 AI 配合 Gemini CLI 登录踩坑记录:GOOGLE_CLOUD_PROJECT_ID 的坑与解法 在 MacOS 上,成功恢复存储卡上被误删的照片 AI CLI 工具:Claude Code, Codex, Gemini CLI, Qwen code, CodeBuddy cli, cursor-agent 我的常用命令 港漂日记62:父亲节独自带娃,室内游戏、香港公园探展、观鸟、品味米其林餐厅 南航随心飞机票爬虫解密 acw_sc__v2 港漂日记61:香港私立诊所首诊:商业医保如何改变我的就医体验? 香港历史博物馆:看秦始皇兵马俑,还能和孔子比身高? 港漂日记59:母亲节礼物!AI 涂色小技巧,让孩子的爱跃然纸上 港漂日记60:西营盘网红旧书店 Book & Go 淘书记 港漂日记58:萌娃中环学体操,课后老师狂点赞 五一游记D4:深圳笔架山儿童乐园,邂逅无人机送外卖 我的400篇博客都写了些什么 珊瑚海兔四岁啦 港漂日记D159:亲子同乐日:一场精彩的幼儿园嘉年华 蛇年春节自驾D10:东莞-深圳-香港 DeepSeek教我如何收拾行李箱 福田取逗留签 回港新方式 蛇年春节自驾D9:江门-顺德-东莞 中国侨都华侨华人博物馆 东莞迎宾馆 蛇年春节自驾D8:茂名-开平-江门 挥春作业 粤西堵车 开平碉楼 迎财神 茂名博物馆参观记 蛇年春节自驾D7:茂名 中国第一摊 茂名博物馆 亚朵酒店 蛇年春节自驾D6:南宁-茂名 发财树 青秀山 路途亲子游戏 蛇年春节自驾D5:南宁过大年 醒狮贺岁 三街两巷 特色美食 骑行穿城 琅西夜市 打铁花 新春好!我用DeepSeek写祝福,顺便送你三款红包封面 蛇年春节自驾D4:钦州-南宁 钦州老街,万丽年夜饭 蛇年春节自驾D3:海陵岛-钦州 绝美悬崖餐厅,海景房租赁行情 明明如月成长笔记2024年公众号创作回顾(含免费红包封面🧧) 蛇年春节自驾D2:深圳-阳江-海陵岛 明明和虹虹2024年公众号创作回顾(含免费红包封面🧧) 蛇年春节自驾D1:深圳亲子游 港漂日记D118:备战HK100,徒步港岛'恐龙径' 港漂日记D115:春节大筹备:AI 助力,书法添彩 港漂日记D114:推荐两款适合新港漂使用的app 2025新年计划之:全面拥抱AI 港漂日记D111:备战HK50 港岛径拉练 港漂日记D110:一个普通的周六见闻,聚餐、借书、儿童乐园,体育选拔机制,公共自习室,挫折教育 我的2024:辗转四城,忙碌充实 港漂日记D104:港大幸福家庭博览会,亲子工坊与未来趋势 港漂日记D101:赤柱圣诞狂欢,古迹海景遛娃 港漂日记D100:港漂百日,圣诞快乐🎄 港漂日记D97:欢乐星期天:港大访古探幽,尖沙咀购物赏景 港漂日记D96:太平山卢吉道:一次穿越山林、俯瞰繁华的震撼之行 皇马巴萨元老赛:传奇重逢,闪耀球场 港漂日记D93:宝宝居港三月余,英语表达大进步 港漂日记D90:绘本阅读,潜水展,华嫂冰室 港漂日记D89:宝妈带娃闯大馆,老友相聚话鸡娃 港漂日记D84:消防队亲子嘉年华:风车 DIY、叠杯子,奖品拿到手软! 港漂日记D83:港澳通行证:深圳换证碰壁,香港解锁秘籍 港漂日记D82:笑不活了!在 “知悭识水”嘉年华,我被自家娃的“鬼画符”征服 别再傻傻手工记账!AI 加持 beancount,效率狂飙 N 倍,真香警告 港漂日记D76:勇闯艺趣嘉年华,数数宝宝戴了几顶帽子 港漂日记D75:抵港首次学校秋游 奔赴元朗开心农场 港漂日记D73:深圳盐田周末放松游 | 高铁'灵活行'思考 | 灯塔图书馆 | 壹海城 | 盐田印象 | 港深对比 港漂日记D72:深度揭秘:我是怎么借助AI创作宝宝校庆视频的 港漂日记D71:盐田中英街漫记:海岸盛景,历史长歌 港漂日记D70:海南巨舰下香港,全民共赴海军约 港漂日记D69:完了!在香港,幼儿园小班作业居然做到晚上九点多。。。 港漂日记D68:亲子共赴嘉年华,反诈工坊入童心 港漂日记D61:哇塞!西九龙超燃嘉年华,亲子嗨玩,禁毒护航! 港漂日记D55:台风过境,顶楼泳池看海景,铜锣湾逛吃不停歇 港漂日记D50:探秘香港看病:为宝宝抢号二十次,诊疗却遭宝妈质疑 “没意义”? 港漂日记D45:复诊体验,天哪!在香港做B超居然排到了2027年。。。 港漂日记D42:香港迪士尼 x 万圣节:游客 Cosplay 百态,共赴奇趣冒险 港漂日记D32:在香港读杂志《明报周刊》《国家地理》 港漂日记D31:在校尿裤子怎么办?爷爷寄来滑板车 爸爸讲英文绘本 港漂日记D30:楼顶滑步车 画画闹情绪 拼多多发掘低价秘诀 港漂日记D29:生活的琐碎与温暖 港漂日记D28:深圳一日游 跨境巴士体验 万象天地 陶陶居 gaga 港漂日记D27:香港公园 读绘本 淘拼集运自提体验pk 睡前故事的四个阶段 港漂日记D26:幼儿园小班竟有五项作业 给工人姐姐一部手机 港漂日记D25:社区托班体验 菜鸟驿站取件 港漂日记D22:社区托班报名 中山纪念公园体育课 乔治五世纪念公园观察 港漂日记D21:东涌东荟城 大屿山双峰越野赛 辅导作业 港漂日记D20:和平号环球游轮分享会 数码港 儿童加油站 港漂日记D15:参观幼儿园,登太平山看夜景,杜莎夫人蜡像馆 港漂日记D14:长洲岛的缤纷一日:奇趣与温情交织 港漂日记D13:香港中央图书馆观察 麦当劳价格 佐治五世纪念公园 社区配套 港漂日记D12: 免费早报 宝宝报课情况 AppleTV 港漂日记D11: 回国代理,智能家居,晨间习惯 港漂日记D10: 折腾智能家具设备,HomeKit,HomeAssistant,AppleTV,米家 港漂日记D8:西区社区中心探访 困难班 辅导班 童军 港漂日记D7:北上消费,中式独居生活vs美式家庭生活,车和家,重典治乱 港漂日记D6:宝宝天星小轮,宝爸研究医保 港漂日记D5:回顾宝宝一周学习表现 港漂日记D4:宝宝生活习惯与社交的思考 港漂日记D3:香港中秋怎么放假,看亚冠,老房子水质问题 港漂日记D2:中秋铜锣湾赏灯,学校手工作品 港漂日记D1:宝宝上学,校车接送,街市买菜,安装马桶,物业规矩,垃圾处理,读报感悟 港漂日记D0:南京飞香港,禄口V7,国泰航空,光大银行送机,上海银行境外接机 在南京六朝博物馆,我看到了195件禁止出国文物中的2件 驾照过期了怎么办?原来还可以在异地轻松补办 镇江博物馆:精美的器物与缺失的展示 镇江一日游:润扬大桥,金山寺,锅盖面,镇江博物馆 扬州一日游:博物馆、历史、恐龙、雕版印刷、富春茶社 子女体育规划指南:揭秘奥运冠军对身体素质的要求 杭州萧山机场 T4 航站楼国际出发 V25 贵宾厅体验 2035年的上海是什么样子?上海城市规划展示馆绝美揭秘! 李笑来又出书了!这次只花了18美金和一天时间!深度拆解他是如何用GPT-4o快速写书的
题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch
lmm333 · 2010-12-04 · via 明明如月成长笔记

题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。

分析:这道题没有多少实际意义,因为在软件开发中不会有这么变态的限制。但这道题却能有效地考查发散思维能力,而发散思维能力能反映出对编程相关技术理解的深刻程度。

通常求1+2+…+n除了用公式n(n+1)/2之外,无外乎循环和递归两种思路。由于已经明确限制for和while的使用,循环已经不能再用了。同样,递归函数也需要用if语句或者条件判断语句来判断是继续递归下去还是终止递归,但现在题目已经不允许使用这两种语句了。

我们仍然围绕循环做文章。循环只是让相同的代码执行n遍而已,我们完全可以不用for和while达到这个效果。比如定义一个类,我们new一含有n个这种类型元素的数组,那么该类的构造函数将确定会被调用n次。我们可以将需要执行的代码放到构造函数里。如下代码正是基于这个思路:

class Temp
{
public:
      Temp() { ++ N; Sum += N; }

      static void Reset() { N = 0; Sum = 0; }
      static int GetSum() { return Sum; }

private:
      static int N;
      static int Sum;
};

int Temp::N = 0;
int Temp::Sum = 0;

int solution1_Sum(int n)
{
      Temp::Reset();

      Temp *a = new Temp[n];
      delete []a;
      a = 0;

      return Temp::GetSum();
}

我们同样也可以围绕递归做文章。既然不能判断是不是应该终止递归,我们不妨定义两个函数。一个函数充当递归函数的角色,另一个函数处理终止递归的情况,我们需要做的就是在两个函数里二选一。从二选一我们很自然的想到布尔变量,比如ture(1)的时候调用第一个函数,false(0)的时候调用第二个函数。那现在的问题是如和把数值变量n转换成布尔值。如果对n连续做两次反运算,即!!n,那么非零的n转换为true,0转换为false。有了上述分析,我们再来看下面的代码:

class A;
A* Array[2];

class A
{
public:
      virtual int Sum (int n) { return 0; }
};

class B: public A
{
public:
      virtual int Sum (int n) { return Array[!!n]->Sum(n-1)+n; }
};

int solution2_Sum(int n)
{
      A a;
      B b;
      Array[0] = &a;
      Array[1] = &b;

      int value = Array[1]->Sum(n);

      return value;
}

这种方法是用虚函数来实现函数的选择。当n不为零时,执行函数B::Sum;当n为0时,执行A::Sum。我们也可以直接用函数指针数组,这样可能还更直接一些:

typedef int (*fun)(int);

int solution3_f1(int i)
{
      return 0;
}

int solution3_f2(int i)
{
      fun f[2]={solution3_f1, solution3_f2};
      return i+f[!!i](i-1);
}

另外我们还可以让编译器帮我们来完成类似于递归的运算,比如如下代码:

template <int n> struct solution4_Sum
{
      enum Value { N = solution4_Sum<n - 1>::N + n};
};

template <> struct solution4_Sum<1>
{
      enum Value { N = 1};
};

solution4_Sum<100>::N就是1+2+...+100的结果。当编译器看到solution4_Sum<100>时,就是为模板类solution4_Sum以参数100生成该类型的代码。但以100为参数的类型需要得到以99为参数的类型,因为solution4_Sum<100>::N=solution4_Sum<99>::N+100。这个过程会递归一直到参数为1的类型,由于该类型已经显式定义,编译器无需生成,递归编译到此结束。由于这个过程是在编译过程中完成的,因此要求输入n必须是在编译期间就能确定,不能动态输入。这是该方法最大的缺点。而且编译器对递归编译代码的递归深度是有限制的,也就是要求n不能太大。

大家还有更多、更巧妙的思路吗?欢迎讨论^_^

博主何海涛对本博客文章享有版权。网络转载请注明出处http://zhedahht.blog.163.com/。整理出版物请和作者联系。

最后附上一个简单的代码:

#include <iostream>

int add(int n, int &sum)

{

   n && add(n-1, sum);

   return sum += n;

{

   int sum = 0;

   int n = 100;

   std::cout << add(n, sum) << std::endl;return 0;

}