@nhahtdh からの回答は完全に正しいです。ただし、多数が必要な場合は、組み合わせ因子を計算するのが少し難しいかもしれません (それを行う良い方法についてはコメントを参照してください)。
階乗を渡さずに再帰を使用して同じ数値を計算する方法を次に示します。 int cntPass(int N,int L,int U,int D) として関数を考慮する代わりに、 3 つのいずれかの桁数:
int cntPass(int N,int L,int U,int D, int A)
A = NLUD があることに注意してください。ここで、再帰は最初の文字の選択に基づいています。小文字には 26 個、大文字には 26 個、数字には 10 個の選択肢があります。
ここで、N、L、U、D、および A が与えられると、次のことができます。
- 最初の文字を小文字にする -> 26 の可能性。これらの可能性のそれぞれについて、残りのパスワードには cntPass(N-1,L-1,U,D,A) の可能性があります。L=0 の場合、 A>0 でない限り、これは機能しないことに注意してください。つまり、選択できない文字がまだいくつかあります。この場合、それぞれに cntPass(N-1,L,U,D,A-1) を使用した 26 の可能性もあります。
- 大文字の同上
- 数字の同上。
再帰を終了するには、N=1 の場合は可能性の数を設定するか、N=0 の場合は同様に数を設定します (シンボリック 1 に)。
これを行うMatlabコード(簡単なテストにMatlabを使用)は次のとおりです。
function [number]=Nword(N,LowerCase,UpperCase,Digit,Any)
number = 0;
if ( LowerCase > 0)
number = number + 26*Nword( N-1, LowerCase-1, UpperCase, Digit, Any);
elseif (Any > 0)
number = number + 26*Nword( N-1, LowerCase, UpperCase, Digit, Any-1);
end
if ( UpperCase > 0)
number = number + 26*Nword( N-1, LowerCase, UpperCase-1, Digit, Any);
elseif( Any > 0)
number = number + 26*Nword( N-1, LowerCase, UpperCase, Digit, Any-1);
end
if ( Digit > 0)
number = number + 10*Nword( N-1, LowerCase, UpperCase, Digit-1, Any);
elseif( Any > 0)
number = number + 10*Nword( N-1, LowerCase, UpperCase, Digit, Any-1);
end
if (number == 0)
number = 1;
end
return