###前提・実現したいこと
所定の文字全てを重複ありの総当たりで出力するプログラムを書きたいです(パスワードのブルートフォースアタックを行うイメージ)。
for文を使ったロジックは理解していますが、必要な桁数が増えるたびにfor文を書き加えなければならないため再帰呼び出しを使い柔軟な実装にしたいと考えています。
"abc" 3つの文字列を使う場合下記のような結果を期待しています。
a b c aa ab ac ba bb bc ca cb cc aaa aab aac
###発生している問題・エラーメッセージ
再帰のロジックがわかりません。
どのようなコードになるか2,3日考えてみましたが頭がこんがらがってしまいます。
恐らく下記コードの★★★部分のブロックのロジックが正しくないのだろうとは思っています。
どなたかご教授頂けないでしょうか……。
###該当のソースコード
golang
1func pow(n, a int) int { 2 if a == 0 { 3 return 1 4 } 5 x := n 6 for i := 1; i < a; i++ { 7 n = n * x 8 } 9 return n 10} 11 12func getPasswordCandidate(ss string, count int) string { 13 char := "abcde" 14 if count < len(char) { // 終了条件 15 return ss + string(char[count]) 16 } 17 for i := 0; ; i++ { //★★★ 18 if pow(len(char), i) > count { 19 return getPasswordCandidate(ss+string(char[count/len(char)-1]), count-pow(len(char), i-1)) 20 } 21 } 22} 23 24func main() { 25 for i := 0; i <= 16; i++ { 26 fmt.Println(getPasswordCandidate("", i)) 27 } 28} 29
上記コードの実行結果
a b c d e aa ab ac ad ae baa bab bac bad bae cbaa cbab
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/30 07:26