【发布时间】:2012-03-03 14:21:57
【问题描述】:
我需要编写一个像这样遍历字母 (a-z) 的函数:
(这里是 a-c 的例子)
a
b
c
aa
ab
ac
ba
bb
bc
ca
cb
cc
aaa
aab
aac
... and so on. (until the word has 5 characters)
知道怎么做吗?我想我需要一些递归函数。
【问题讨论】:
我需要编写一个像这样遍历字母 (a-z) 的函数:
(这里是 a-c 的例子)
a
b
c
aa
ab
ac
ba
bb
bc
ca
cb
cc
aaa
aab
aac
... and so on. (until the word has 5 characters)
知道怎么做吗?我想我需要一些递归函数。
【问题讨论】:
不需要递归!
for($char = 'a'; $char != 'aaaaaa'; $char++){
echo $char . PHP_EOL;
}
【讨论】:
这是一种快速的递归方式:
function loopchars($maxlvl,$lvlnow,$cstr){
$chars = array(); //put the chaaracters in here
for($i=0;$i<count($chars);$i++){
$uj=$cstr.$chars[$i];
if($lvlnow==$maxlvl){echo $uj.'<br />';}
else{loopchars($maxlvl,$lvlnow+1,$uj);}
}
}
for($i=1;$i<6;$i++){
loopchars($i,1,'');
}
解释:如果没有达到写出的最大级别,它会再次调用自己。它在循环中添加每个字符。 loopchars($n,1,''); 进行第 n 级迭代,因此循环使每个级别介于 1 和 5 之间。
【讨论】:
为什么需要递归呢?它可能是尾递归的(这意味着它可以迭代地完成)。例如,这里是 Python 中的一个尝试。你已经标记了 PHP,所以如果 PHP 有类似的库,你可以尝试或者在你的代码中实现相应的函数。
import itertools
mystr = "abcde"
for i in range(1,len(mystr)):
for each in itertools.combinations_with_replacement(mystr,i):
print "".join(each)
【讨论】: