由于这次考试太仓促,往届真题搞到了,答案没搞到、更别说挤时间自己去做一份正常答案了。这些反复考的题目,的确有点让人反胃,相反,有一道全新的题目,让我眼前一亮,可我愣是苦思冥想了两天不得其解,网上也没能找到答案,这不,就来分享给大家了。
这道题目说简单也是非常简单,要求输出以下格式的内容(参数n=5时):
a
aaa
aaaaa
这是逗我玩么?小学生都会的好么,有n种方法可以实现呀!可是对算法有要求,必须使用递归方法,递归不就是反复调用自身么,可能三下五除二就能解决掉吧,暗自庆幸中……可我发现,问题么有这么简单,我根本没有理解递归的真正内涵,考场上五分钟、十分钟、半小时过去了,直到交卷也没想出来。
关于递归的定义:程序调用自身的编程技巧称为递归( recursion)。后来又去科普了一下,很多帖子的解说,高潮迭起,包括我也看的心潮澎湃,感觉都能看懂,最经典的是阶乘使用递归方法,很多教材拿这个做例题,看起来贼溜,模仿一下也没问题,可当遇到这个题目时,有点秀才遇到兵了。。
到底递归是什么呢?我的理解是,装什么鬼弄什么神,不就是后面一项比前面一项多了个什么嘛!比如,阶乘,是多乘了一个数而已。对于这道题目呢?是多了一行,多的这行是什么?没错!是多一行a,仅此而已。
那代码怎么写,想必大家就有点眉目了,我先把python的实现代码贴出来:
#!/usr/bin/env python3.6
# -*- coding: utf-8 -*-
#__author__: Ed Frey
#Date: 18/12/25
def newprint(n):
if n == 1:
print("a")
else:
newprint(n - 2)
print("a" * n)
if __name__ == '__main__':
pprint(5)
这里的n就不做额外限定修饰了,假定我们只能取正奇数。运行结果如下:
/usr/local/bin/python3.6 /Users/.../递归.py
a
aaa
aaaaa
Process finished with exit code 0
阶乘的用法这里就不赘述了,感兴趣的小伙伴可以自行科普。递归,其实真的没什么技术含量,更多的是数学的归纳方法,归纳总结这个“数列”的规律,能找出通项公式来,再去编码,就so easy了。
阶乘,是等比数列,而上面这道题目,千万注意,不能单行单行的去比较,不然可能就掉坑里了,这题就是个等差数列,公差是最后一行,而不是2个a哟。因为我最开始重心就放到2个a的差额上,懵逼了好久。
其实在学习一些新的方法时,经常会雀跃欲试却无从下手,可能还是总结观察不够深入吧。这么简单的一个方法,相信大家可以理解其精髓了吧。有什么疑问,可以留言哈。