1到100求和学算法之循环的秘密(4)
1 引言上一篇文章的主要贡献在于将一次性的累加工作转化为分步的累加,进而实现整体的求和。根据本系列的第(2)篇文章,得出结论,定义a1到a100这100个变量是没有必要的。那么如何进一步减少变量定义的个数呢?本文一起来探讨如何做到这一点。2 问题描述1到100求和问题几乎是所有编程语言初学者都会接触到的一个问题,其定义如下,编程实现:1 + 2+ ··· + 100 = ?限制条件:使用尽可能少的变量。3 问题分析算法 3仅依赖变量定义和加法运算符的1到100求和(改进版)sum = 0a1 = 1sum = sum + a1a2 = 2sum = sum + a2···a100 = 100sum = sum +a100(上面省略号并非程序语言关键词,而是由于空间有限故省略)要想改进算法,前提是要对其进行认真的分析,发现规律。通过对算法3的分析,可以发现如下的规律:ai = isum = sum + ai(i = 1,2,···,100)这个规律是否可以做进一步的优化呢?通过观察发现,ai=i这行代码没有改变i的值,ai和i之间存在冗余,可以直接用i来替代,改进后的模式如下所示:sum = sum + ii = 1,2,···,100经过优化后的模式比之前更简洁和直观。对于i从1到100,这样的模式需要重复一百次。如何设计算法让这样的模式能够重复执行100次成为下一步分析的关键。这样的一个问题经过抽象后就是,对于编程语言而言,如何实现一个有限长度固定模式的重复。其中模式存在两种情况,其一是模式是常量,其二是模式中有变化的地方。举例如下:(1) 重复打印100次“hello,world”字符串。这种模式中不存在变化的地方,都为常量,每一次的重复都是一成不变的。(2) 重复打印i,其中i=1,2,···,100。这种情况下,每一次的重复,对于i都是变化的。循环结构是解决这一重复问题的利器。一般情况下编程语言会提供for、while和do...while三种循环结构,其中for是最基础同时也是最重要的结构。sum = 0for i = 1 to 100:sum = sum + i重复执行sum = sum + i 共计100次,而且每一次执行的时候,改变i的值,如第1次执行的时候,i=1,第2次执行的时候,i=2,以此类推。这样就完成了模式的重复。至此,1到100求和问题,只使用了i和sum两个变量就完成了求和。1到100求和是编程初学者都会接触到的一个问题,选择这样的一个问题作为分析的对象,重点不在于如何解决这个问题,如何编程实现1到100求和,而是一步一步严谨的分析过程。试想假如编程语言没有提供循环结构,你该如何解决这个问题呢?下周将发布《1到100求和学算法之循环的秘密》系列的最后一篇文章,将全面总结分析流程和关键问题,欢迎持续关注。