【发布时间】:2017-07-10 21:39:23
【问题描述】:
此代码旨在循环遍历提供的字符串中的每个字母并继续直到 z,然后递增前一个字母并在 a 处重新开始(例如,从“bde”开始,下一个将是“bdf”,以“zzz”结束" - 与典型循环的工作方式相同。)
我当然可以做一个嵌套的理解,因为这只有三个层次,但如果层次任意深,我传统上的方法是使用递归(如下所示),基本上相当于一个深度优先搜索。
这种方法的问题是任何非平凡大小的输入都会破坏堆栈(例如,“abcd”),我想不出没有递归的好方法。在 clojure 代码下实现的 Python 中的类似方法(有一些小的差异,例如在可变列表中累积结果)不会达到输入“abcd”的堆栈限制。
我尝试使用循环/递归,但这个结构似乎在 for 宏中不起作用,因为调用必须在下一次循环迭代时暂停,因此不在尾部位置(至少我相信这是原因) .
解决这类问题最惯用的方法是什么?
;;; example using for macro
(defn gen-pw [pw r]
(cond (empty? pw) r
:else (flatten (for [x (range (int(first pw)) 123)]
(gen-pw (rest pw) (str r (char x)))))))
;;; example using map instead of for macro
(defn gen-pw [pw r]
(cond (empty? pw) r
:else (flatten (map #(gen-pw (rest pw) (str r (char %)))
(range (int(first pw)) 123)))))
(gen-pw "bde" "")
def gen_pw(pw,r='',final=[]):
if not pw:
final.append(r)
return
for letter in range(ord(pw[0]),123):
gen_pw(pw[1:],r + chr(letter))
return final
print(gen_pw('abcd'))
【问题讨论】:
-
不清楚您要完成什么。这个过程是否应该为给定的字符串创建一个字典顺序的列表,即
("bde" "bdf" "bdg" ... "zzz")? -
是的,这就是目的。