想要在 c 中打印矩阵元素的组合
Want to print combinations of elements of matrix in c
我有一个二维矩阵
我想打印第一行与其余行的组合
这是我尝试过的方法:
由于解决方案需要通用,我使用递归来打印循环和数字。
#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
您递归地构建解决方案。随着递归的深入,您会不断附加相应矩阵行的数字,直到您从每一行中选择一个数字。
执行此操作时,您必须跟踪已为前几行选择的数字,以便打印它们。
拜托,请不要使循环变量成为全局变量。理想情况下,不要使用任何全局变量,但如果必须,请使它们唯一。在您的示例中,i
、n
、row
和 col
可以是局部变量或全局变量,具体取决于上下文。很难看出一个符号真正指的是哪个变量。
您的 printnumbers
和 printloop
函数应该是 void
或 return 对所有分支有意义的值。编译器警告应该告诉您,当您的执行到达函数末尾时,您不需要 return 任何东西。
这是不需要全局变量的版本,它将选择的数字保存在调用函数中分配的辅助缓冲区 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 开始,您可以在将数组的维度作为参数传递时将其设为变量。此参数必须位于数组参数之前。)
其实在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
谢谢!
我有一个二维矩阵 我想打印第一行与其余行的组合
这是我尝试过的方法:
由于解决方案需要通用,我使用递归来打印循环和数字。
#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
您递归地构建解决方案。随着递归的深入,您会不断附加相应矩阵行的数字,直到您从每一行中选择一个数字。
执行此操作时,您必须跟踪已为前几行选择的数字,以便打印它们。
拜托,请不要使循环变量成为全局变量。理想情况下,不要使用任何全局变量,但如果必须,请使它们唯一。在您的示例中,i
、n
、row
和 col
可以是局部变量或全局变量,具体取决于上下文。很难看出一个符号真正指的是哪个变量。
您的 printnumbers
和 printloop
函数应该是 void
或 return 对所有分支有意义的值。编译器警告应该告诉您,当您的执行到达函数末尾时,您不需要 return 任何东西。
这是不需要全局变量的版本,它将选择的数字保存在调用函数中分配的辅助缓冲区 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 开始,您可以在将数组的维度作为参数传递时将其设为变量。此参数必须位于数组参数之前。)
其实在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
谢谢!