首页 > 解决方案 > 如何将此递归更改为循环

问题描述

我想将一定长度的所有 base-26 数字(以字母表中的字母作为数字)写入 ASCII 文件。对于长度 = 4,这看起来像

aaaa
aaab
aaac
...
zzzx
zzzy
zzzz

我使用以下递归代码实现了这一点:

def fuz(data, ll_str):
    ll_str += 1
    def for_once(data_once, ll_str_once):
        tmp_str = ll_str_once
        tmp_str -= 1
        new_data = []
        for m in data_once:
            for i1 in range(97, 123):
                new_data.append(m + chr(i1))
        if tmp_str != 0:
            return for_once(new_data, tmp_str)
        else:
            return data_once
    return for_once(data, ll_str)
if __name__ == '__main__':
    ll = 4
    test = ['']
    file_output = open("out.txt", 'a')
    out_data = fuz(test, ll)
    for out in out_data:
        file_output.write(out + '\n')
    file_output.close()

但是,对于任何长度 > 4,此解决方案会在我的机器上耗尽内存。

因此,我寻找一个没有递归的替代方案 - 任何人都可以给我一个提示如何做到这一点?

标签: python

解决方案


此循环将所有长度为 4 的 base-26 数字(以字母作为数字)写入名为 out.txt 的文件中。基数和长度可以任意选择 - 但准备耐心等待更高的值......

import itertools as it

base = 26
lngth = 4
with open('out.txt', 'w') as f:
    for t in it.product(range(97, 97+base), repeat=lngth):
        s = ''.join(map(chr, (t)))
        f.write(s + chr(13))

至少它不会按照 OP 的要求消耗太多内存。但是,对于 base 26,长度为 5 的文件已经有 70MB,长度为 6 的文件我在 1.4GB 处停止了写入过程;Notepad++ 已经无法再打开它了。所以大家可以自己想想这段代码的使用。


推荐阅读