【问题标题】:Want to print combinations of elements of matrix in c想在c中打印矩阵元素的组合
【发布时间】:2015-07-21 16:30:43
【问题描述】:

我有一个二维矩阵 我想打印第一行与其余行的组合

这是我尝试过的:

由于解决方案需要通用,我正在使用递归打印循环和数字。

#include<stdio.h>
int i,n,j,k,row=3,col=3,mat[10][10]={{1,2,3},{4,5,6},{7,8,9}};

int printnumbers(int n,int i)
{
    if(n>=row)
    {
        n=0;
        printf("\n");
        return 0;
    }
    printf("%d",mat[n][i]);
    printnumbers(n+1,i);
}

int printloop(int row,int col)
{
    //to check whether the function is being called first time. 
    if(row<=0)
        return 0;

    for(i=0;i<col;i++)
    {
        printloop(row-1,col);
        printnumbers(n,i);
    }        
}

int main()
{
    n=0;
    printloop(row,col);
}

但我无法根据需要提出正确的打印,无法深入思考正确的递归。 这段代码的输出是:

147
258
369

【问题讨论】:

    标签: c recursion matrix combinations


    【解决方案1】:

    您以递归方式构建解决方案。随着递归的深入,您会不断附加各个矩阵行的数字,直到从每一行中选择一个数字。

    这样做时,您必须跟踪已为前几行选择的数字,以便打印它们。

    请不要将循环变量设为全局变量。理想情况下,不要使用任何全局变量,但如果必须,使它们独一无二。在您的示例中,inrowcol 可以是局部变量或全局变量,具体取决于上下文。很难看出符号真正指的是哪个变量。

    您的 printnumbersprintloop 函数应该是 void 或者为所有分支返回一个有意义的值。编译器警告应该告诉您,当您的执行到达函数末尾时,您不会返回任何内容。

    这里的版本不需要全局变量,并将选取的数字保存在辅助缓冲区buf 中,该缓冲区在调用函数中分配。不过,它不会递归地打印组合。

    #include <stdio.h>
    
    void printloop(int n, const int mat[n][n], int buf[n], int ix)
    {
        int i;
    
        if (ix == n) {        
            for (i = 0; i < n; i++) printf("%2d", buf[i]);
            putchar('\n');
        } else {
            for (i = 0; i < n; i++) {
                buf[ix] = mat[ix][i];
                printloop(n, mat, buf, ix + 1);
            }
        }    
    }
    
    int main()
    {
        const int mat[3][3] = {
            {1, 2, 3}, {4, 5, 6}, {7, 8, 9}
        };
        int buf[3];
    
        printloop(3, mat, buf, 0);
    
        return 0;
    }
    

    (注意:从 C99 开始,您可以将数组变量的维度作为参数传递。此参数必须位于数组参数之前。)

    【讨论】:

    • buf 实际上总是同一个缓冲区,因为它在 main 中作为指向 buf 的指针传递。它在位置ix 处被重复覆盖,因此在打印时它包含当前递归通过矩阵的路径。如果您没有存储路径,则之前选择的值在您打印组合时将不可用。
    • 然后传递两个维度并调整循环的限制。我希望你知道哪个是哪个。
    【解决方案2】:

    其实在Golang中使用Slices非常简单。

    使上述解决方案通用。

    代码如下:

    package main
    
    import (
        "fmt"
    )
    
    func printElements(input [][]int, buf []int, row int, col int, count int) {
        var i int
    
        if (count == row) {
            for i=0; i<row; i++ {
                fmt.Print(buf[i])
            }
            fmt.Println() 
        } else {
            for i=0 ; i<col; i++ {
                buf[count] = input[count][i]
                printElements(input,buf,row,col,count+1)
            }
        }
    }
    
    func main() {
        var input = [][]int{{1,3,5}, {2,6,7}, {4,8,9}}
    
        row := len(input)
        col := len(input[0])
    
        var buf =  make([]int,col)
    
        printElements(input,buf,row,col,0)  
    }
    

    这是一个通用解决方案,具体取决于您如何初始化切片输入。

    在此处查看输出:Go Playground

    谢谢!

    【讨论】:

      猜你喜欢
      • 2020-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-22
      • 2016-03-10
      相关资源
      最近更新 更多