尝试递归填充和打印出两组的所有归纳函数的问题

Issues trying to recursively populate and print out all inductive functions of two sets

本文关键字:两组 问题 函数 填充 递归 打印      更新时间:2023-10-16

我无法弄清楚如何使我的递归函数正常工作。 这个想法是我有两个集合 A 和 B,我需要打印 A 到 B 的所有归纳函数。 这是我执行此操作的递归函数,但是输出(如下所示(不准确,我虽然可以看到为什么存在该问题,但我无法弄清楚如何解决它......

目前,我有 A = {a,b,c} 和 B = {1,2,3,4} 的正确输出数量,即 24,但它们包含重复数字的函数,这是不可接受的。 此外,一旦我通过它,我就会丢失 B[0],因此会丢失子集 {2,1,3},例如......

任何指导将不胜感激。

void nextFunction(vector<string> A,
                  vector<string> B,
                  vector<string> func,
                  int left,
                  mpq_class total,
                  int index) {
    if (left == 0) {
        print(func, A);
        return;
    }
    for (int i = index; i < B.size(); ++i) {
        func.push_back(B[i]);
        nextFunction(A, B, func, left-1, total, index+1);
        func.pop_back();
    }
}
void print(vector<string> function, vector<string> A) {
    for (int i = 0; i < (A.size()); ++i) {
        cout << "(" << A[i] << "," << function[i] << ") ";
    }
    cout << endl;
}

输出:

(一,1( (乙,2( (三(

(一,1( (二,二( (三,四(

(一,1( (乙,3( (三(

(甲,1( (乙,3( (丙,4(

(一,1( (乙,4( (三(

(一,1( (乙,4( (丙,4(

(一,二

( (二,二( (三(

(一,二

( (二,二( (四(

(一,2( (乙,3( (三(

(一,2( (乙,3( (三( (丙,4(

(一,二( (乙,四( (三(

(一,2( (乙,4( (三,四(

(a,3( (b,2( (c,3(

(一,3( (乙,2( (丙,4(

(甲,3( (乙,3( (丙,3(

(一,三( (乙,3( (丙,4(

(甲,3( (乙,4( (丙,3(

(一,3( (乙,4( (丙,4(

(一,四( (乙,二( (三(

(一,四( (二,二( (三,四(

(一,四( (乙,3( (三(

(甲,4( (乙,3( (丙,4(

(甲,4( (乙,4( (丙,3(

(甲,4( (乙,4( (丙,4(

虽然我真的不认为这个问题是递归的好候选者,但你的算法可能如下所示:

PrintPossibleFunctions (range_values, already_chosen, fn_def):
    if fn_def.size() == domain.size():
       print elements in order, preceded by the corresponding domain element
       return
    for value in range_values:
        if value not in already_chosen:
           already_chosen.insert(value)
           fn_def.push(value)
           PrintPossibleFunctions(range_values, already_chosen, fn_def)
           fn_def.pop()
           already_chosen.remove(value)