分享

1到100求和学算法之循环的秘密(4)

 算法与编程之美 2020-12-21

1 引言

上一篇文章的主要贡献在于将一次性的累加工作转化为分步的累加,进而实现整体的求和。根据本系列的第(2)篇文章,得出结论,定义a1到a100这100个变量是没有必要的。那么如何进一步减少变量定义的个数呢?本文一起来探讨如何做到这一点。

2 问题描述

1到100求和问题几乎是所有编程语言初学者都会接触到的一个问题,其定义如下,编程实现:

1 + 2+ ··· + 100 = ?

限制条件:使用尽可能少的变量。

3 问题分析

算法 3仅依赖变量定义和加法运算符1100求和(改进版)

sum = 0

a1 = 1

sum = sum + a1

a2 = 2

sum = sum + a2

···

a100 = 100

sum = sum +a100

(上面省略号并非程序语言关键词,而是由于空间有限故省略)

要想改进算法,前提是要对其进行认真的分析,发现规律。通过对算法3的分析,可以发现如下的规律:

ai = i

sum = sum + ai

(i = 1,2,···,100)

这个规律是否可以做进一步的优化呢?通过观察发现,ai=i这行代码没有改变i的值,ai和i之间存在冗余,可以直接用i来替代,改进后的模式如下所示:

sum = sum + i

i = 1,2,···,100

经过优化后的模式比之前更简洁和直观。对于i从1到100,这样的模式需要重复一百次。如何设计算法让这样的模式能够重复执行100次成为下一步分析的关键。

这样的一个问题经过抽象后就是,对于编程语言而言,如何实现一个有限长度固定模式的重复。其中模式存在两种情况,其一是模式是常量,其二是模式中有变化的地方。举例如下:

(1) 重复打印100次“hello,world”字符串。这种模式中不存在变化的地方,都为常量,每一次的重复都是一成不变的。

(2) 重复打印i,其中i=1,2,···,100。这种情况下,每一次的重复,对于i都是变化的。

循环结构是解决这一重复问题的利器。一般情况下编程语言会提供for、while和do...while三种循环结构,其中for是最基础同时也是最重要的结构。

sum = 0

for 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求和学算法之循环的秘密》系列的最后一篇文章,将全面总结分析流程和关键问题,欢迎持续关注。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多