前些天关于小学生寒假作业思考题的推文引发大量的讨论,见:连小学生都开始学编程了。
我提到了其实是使用了一个 combinat::permn 轮子,生成1-9数字的全排列形式,有362880种可能性。然后有网友留言,提到了可以写一个递归函数即可产生这个排列,无需使用轮子, 我就邀请他分享一下:
网友(董理聪)投稿
应曾老师的邀请,这里发邮件说说生成全排列的算法。也只是基本算法的实现而已。
递归函数
如果一个函数在内部调用自身,就是递归函数。
通常来说,一门程序语言的教程在讲到函数的时候,也都会提及到 迭代 与 递归。
最经典的使用递归函数的例子是生成 Fibonacci 数列。
def Fibonacci(n):
if n == 0:
return 0
if n in [1, 2]:
return 1
return Fibonacci(n - 1) + Fibonacci(n - 2)
于是生成全排列的方法也可以使用递归函数。
def permutations(iterable):
if len(iterable) == 1:
yield iterable
# 每次抽出一个元素,其他元素再产生全排列
for i, element in enumerate(iterable):
for p in permutations(iterable[:i] + iterable[i + 1:]):
yield [element, ] + p
permutations(list(range(1, 9)))
这个网友强推python ,一直在使用 Jupyter Notebook;希望我们以后的教程,比如 rm(ls = ls())
的代码没有必要放在推文里;
学徒作业
首先是使用R语言实现这个递归函数,如果你能力足够强悍,也可以考虑shell脚本实现!
再怎么强调生物信息学数据分析学习过程的计算机基础知识的打磨都不为过,我把它粗略的分成基于R语言的统计可视化,以及基于Linux的NGS数据处理:
把R的知识点路线图搞定,如下:
- 了解常量和变量概念
- 加减乘除等运算(计算器)
- 多种数据类型(数值,字符,逻辑,因子)
- 多种数据结构(向量,矩阵,数组,数据框,列表)
- 文件读取和写出
- 简单统计可视化
- 无限量函数学习
Linux的6个阶段也跨越过去 ,一般来说,每个阶段都需要至少一天以上的学习:
- 第1阶段:把linux系统玩得跟Windows或者MacOS那样的桌面操作系统一样顺畅,主要目的就是去可视化,熟悉黑白命令行界面,可以仅仅以键盘交互模式完成常规文件夹及文件管理工作。
- 第2阶段:做到文本文件的表格化处理,类似于以键盘交互模式完成Excel表格的排序、计数、筛选、去冗余,查找,切割,替换,合并,补齐,熟练掌握awk,sed,grep这文本处理的三驾马车。
- 第3阶段:元字符,通配符及shell中的各种扩展,从此linux操作不再神秘!
- 第4阶段:高级目录管理:软硬链接,绝对路径和相对路径,环境变量。
- 第5阶段:任务提交及批处理,脚本编写解放你的双手。
- 第6阶段:软件安装及conda管理,让linux系统实用性放飞自我。