前面
运用递归生成10bp所有可能的DNA序列,即由A,T,G,C组成的所有长度为10的字符串。一个位置有4种可能,一共存在有 4^10 = 1048576可能的字符串。
递归
递归之前已经写过可以查看汉诺塔游戏的递归解析。看了这篇文章,再来琢磨下能不能自己写出代码。能写出来,代表你理解了~。
代码
这里提供Python和C两个语言的代码。经过比较,C的代码比Python的快的很多~
Python
import sys sys.setrecursionlimit(1048577) # Python默认允许的递归深度为1000,需要重新设置一下。 L = 10 base = ["A", "T", "G", "C"] dna_seq = ["N"] * 10 def DNA(handle, idx): idx += 1 for N in base: if idx < L: dna_seq[idx] = N DNA(handle, idx) else: seq = "".join(dna_seq) handle.write(seq) handle.write("\n") return 0 def main(): with open("DNA_10bp.txt", "w") as f: idx = -1 DNA(f, idx) main()
C
#include <stdio.h> #include <stdlib.h> int DNA(FILE *fp, int idx) { static char base[] = {'A', 'T', 'G', 'C', '\0'}; static char dna[12]; idx++; for (int i = 0; i < 4; i++) { if (idx < 11) { dna[idx - 1] = base[i]; DNA(fp, idx); } else { dna[idx-1] = '\n'; dna[idx + 1] = '\0'; fputs(dna, fp); return 0; } } return 0; } int main() { FILE *fp; int idx = 0; fp = fopen("DNA_10bp.fasta", "w"); DNA(fp, idx); fclose(fp); return 0; }