- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
这个问题以前用其他语言问过,但在搜索SO后没有用delphi问过。看到这个问题:How to Generate Permutations With Repeated Characters这个问题:Generate all combinations of arbitrary alphabet up to arbitrary length还有这个:How to generate combination of fix length strings using a set of characters?所以这个问题并不新鲜,但我很难将其中任何一个翻译成德尔福。
我想做的是生成包含重复字符的组合,例如:如果我们有一串字符(由用户指定):ABC 并且我们想要生成三个字符的长度(也是由用户指定的长度),我会得到:AAA AAB AAC ABA ABB ABC ACA ACB ACC BAA BAB BAC 等...
这段代码似乎是这样做的,但在 C++ 中:
int N_LETTERS = 4;
char alphabet[] = {'a', 'b', 'c', 'd'};
std::vector<std::string> get_all_words(int length)
{
std::vector<int> index(length, 0);
std::vector<std::string> words;
while(true)
{
std::string word(length);
for (int i = 0; i < length; ++i)
word[i] = alphabet[index[i]];
words.push_back(word);
for (int i = length-1; ; --i)
{
if (i < 0) return words;
index[i]++;
if (index[i] == N_LETTERS)
index[i] = 0;
else
break;
}
}
}
这似乎也是这样做的:
#include <iostream>
#include <string>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
void displayPermutation(string permutation[], int length){
int i;
for (i=0;i<length;i++){
cout<<permutation[i];
}
cout << endl;
}
void getPermutations(string operatorBank[], int operatorCount,
string permutation[],int permutationLength, int curIndex){
int i;
//stop recursion condition
if(curIndex == permutationLength){
displayPermutation(permutation,permutationLength);
}
else{
for(i = 0; i < operatorCount; i++){
permutation[curIndex] = operatorBank[i];
getPermutations(operatorBank,operatorCount,permutation,
permutationLength,curIndex+1);
}
}
}
int main ()
{
int operatorCount = 4;
int permutationLength = 3;
string operatorBank[] = {"+","-","*","/"};
string permutation[] = {"","","",""}; //empty string
int curIndex = 0;
getPermutations(operatorBank,operatorCount,permutation,
permutationLength,curIndex);
return 0;
}
最接近我在 delphi 中想要的是在这里找到的,但不允许 AAA
例如: http://www.swissdelphicenter.ch/torry/showcode.php?id=1032
不,如果您在猜测,这不是家庭作业。没有其他动机,只是学习。
编辑 3:从问题中删除了所有不相关的代码,以便其他人更容易阅读并获得以下答案。在答案下查找 2 种不同的方法来实现此目的:一种使用递归,另一种使用计数器函数。
最佳答案
您展示的示例使这比必要的复杂得多,至少在我看来是这样。
您真正看到的是一个以 3 为基数的 3 位数字。您可以从 0 数到 33 = 27,然后将每个数字转换为基数 3(使用 'A'、'B' 和 'C' 作为您的数字而不是 '0'、'1 ' 和 '2')。
在 C++ 中,转换看起来像这样:
std::string cvt(int in) {
static const int base = 3;
static const int digits = 3;
std::string ret;
for (int i = 0; i<digits; i++) {
ret.push_back('A' + in % base);
in /= base;
}
return std::string(ret.rbegin(), ret.rend());
}
有了适当的转换,生成所有组合变得非常简单:
for (int i = 0; i < 27; i++)
std::cout << cvt(i) << "\t";
我认为将其转换为 Delphi 应该几乎不存在纯粹的机械问题——分配从 =
更改为 :=
,%
变为 mod
,整数除法变为 div
,for
循环变为类似 for i = 0 to 27 do
, 等等。最乏味(但最终非常简单)的部分可能是处理这样一个事实,即在 C++ 中,char
只是一个小整数类型,您可以在其上进行普通整数数学运算。至少如果没有记错的话,在 Pascal(或像 Delphi 这样的衍生产品)中,你需要 ord
将字符转换为序数,并需要 chr
从序数转换回来性格。所以 'A' + in % base;
最终会变成更像 chr(ord('A') + in mod base);
不过正如我所说,似乎几乎整个翻译可以/应该几乎完全机械化,不需要对基本算法的工作方式或类似的方式进行真正的更改。
关于algorithm - 根据任意字符串和长度生成字符组合——类似于排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20369409/
我想要以下内容: void foo( /* something representing a function f */, /* arguments a1, a2, etc. in s
简而言之,我想声明一个这样的特征: trait Test { def test(amount: Int): A[Int] // where A must be a Monad } 这样我就可以
在 GWT 中,如何在 onModuleLoad 方法中插入框架集以及相对嵌套的框架集和框架,以合并许多小程序和其他小部件和 HTML?代码片段是: 公共(public)类 MainEntryPoin
这个问题在这里已经有了答案: How do I best simulate an arbitrary univariate random variate using its probability
我对java相当陌生,并且习惯于枚举本质上只不过是一个命名的整数列表。 现在我正在编写一个实现,其中父类有几个采用枚举值作为参数的方法。枚举将在子类中定义,并且会略有不同。由于枚举基本上看起来像类,所
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 6 年前。 Improve this ques
想象一下 6-7 台服务器的设置都完全相同Java 版本“1.6.0_18”OpenJDK 运行时环境 (IcedTea6 1.8) (fedora-36.b18.fc11-i386)OpenJDK
这个问题在这里已经有了答案: What are some uses of template template parameters? (10 个答案) 关闭 4 年前。 我有一个根据策略舍入值的函数
我正在寻找如何在 Java 中给定一个 Async CompletableFutures 列表,以便前 N 个中的任何一个成功完成或失败。除非没有 N 次成功,否则忽略任何失败。 有这方面的例子吗?
我面临的问题是项目已经使用集群编程来分配任务。 if (cluster.isMaster) { // Fork workers. for (var i = 0; i { }); } el
我正在为 Luxology modo(3D 和 VFX 应用程序)编写脚本,该脚本使用 python 作为脚本语言。在我的脚本中的某个位置,我正在读取从其他应用程序输出的文本文件,并从该文本文件的行创
这个问题在这里已经有了答案: Fast arbitrary distribution random sampling (inverse transform sampling) (5 个答案) 关闭
我只是遇到了一个问题,我有一个结构数组,例如 package main import "log" type Planet struct { Name string `json:"
我正在尝试将 class ResponseResult 编码为 json case class ResponseResult (var Code : Int, var
我想将一个矩阵中的一个 block 复制到另一个矩阵的一部分中。要将其与任何类型的 n 维数组一起使用,我需要通过 [] 运算符应用带有偏移量的列表。有办法做到这一点吗? mat_bigger[0:5
我有一个匹配一组数字和字母的正则表达式。但是我希望能够排除任何三个连续的字母。这是为了防止意外形成单词或缩写。 我的表达如下。它还排除了一些类似的字符,如 0、o、O 和 1、i、I、l): ^[2-
根据documentation . 应匹配任何字符,但不匹配重音字符。 mysql> select 'test' regexp 't.st'; +----------------------+ | '
我该如何用 JavaScript 编写这个 if 语句? if(url == "http://www.google.com/" && "*") { ... } * 需要灵活并接受添加到第一个变量上
我知道 cPython 有一个 GIL,因此如果不使用多处理模块,您的脚本就无法在多个内核上运行。但是有什么可以阻止内置功能,例如使用多核进行排序吗?我不了解 cPython 结构,但我想我要问的问题
寻找命令行 gdb 的替代方法来检查 OSX 上的核心转储 - 有没有办法让 Xcode 打开带有调试符号的任意核心转储? 最佳答案 您是否尝试过使用 MachOView 1? 听起来它可能适用于查看
我是一名优秀的程序员,十分优秀!