【发布时间】:2019-04-24 08:16:30
【问题描述】:
问题:我很难建立对递归的理解(学习缓慢),每当我负责创建 recursive 函数时,我总是通过 @987654322 创建它@ 第一的。
然后我尽我所能达到递归的一些基本规则,但通常最终感觉有点筋疲力尽。
我要做的就是将我的 winnerCheck 函数转换为工作 recursively。
另外,我听说使用global variables 是不受欢迎的。这是真的?我应该将我的数组square 移动到本地工作吗?
感谢您提供的任何指导和意见。
代码:
#include<stdio.h>
#include<conio.h>
char square[10] = {'o', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
int winnerCheck();
void board();
int main() {
/*
char board[3][3] = {
};
printf("\t|\t|\t\n");
printf("\t|\t|\t\n");
printf("________|_______|________\n");
printf("\t|\t|\t\n");
printf("\t|\t|\t\n");
printf("________|_______|________\n");
printf("\t|\t|\t\n");
printf("\t|\t|\t\n");
printf("\t|\t|\t\n");
*/
int player = 1, i, choice;
char mark;
do {
board();
player = player % 2 ? 1 : 2;
printf("Player %d, enter a number: ", player);
scanf("%d", &choice);
//mark = (player == 1) ? 'X' : 'O';
if (player == 1) {
mark = 'X';
} else {
mark = '0';
}
if (choice == 1)
square[1] = mark;
else if (choice == 2)
square[2] = mark;
else if (choice == 3)
square[3] = mark;
else if (choice == 4)
square[4] = mark;
else if (choice == 5)
square[5] = mark;
else if (choice == 6)
square[6] = mark;
else if (choice == 7)
square[7] = mark;
else if (choice == 8)
square[8] = mark;
else if (choice == 9)
square[9] = mark;
i = winnerCheck();
player++;
} while (i == -1);
board();
if (i == 1)
printf("==>\aPlayer %d win ", --player);
else
printf("==>\aGame draw");
getch();
return 0;
}
int winnerCheck() {
if (square[1] == square[2] && square[2] == square[3])
return 1;
else if (square[4] == square[5] && square[5] == square[6])
return 1;
else if (square[7] == square[8] && square[8] == square[9])
return 1;
else if (square[1] == square[4] && square[4] == square[7])
return 1;
else if (square[2] == square[5] && square[5] == square[8])
return 1;
else if (square[3] == square[6] && square[6] == square[9])
return 1;
else if (square[1] == square[5] && square[5] == square[9])
return 1;
else if (square[3] == square[5] && square[5] == square[7])
return 1;
else if (square[1] != '1' && square[2] != '2' && square[3] != '3' && square[4]
!= '4' && square[5] != '5' &&
square[6] != '6' && square[7] != '7' && square[8]
!= '8' && square[9] != '9')
return 0;
else
return -1;
}
void board() {
printf("\n\n\tTic Tac Toe\n\n");
printf("Player 1 (X) - Player 2 (O)\n\n\n");
//prints the board after every input
printf(" | | \n");
printf(" %c | %c | %c \n", square[1], square[2],square[3]);
printf("____|_____|____\n");
printf(" | | \n");
printf(" %c | %c | %c \n", square[4], square[5],square[6]);
printf("____|_____|____\n");
printf(" | | \n");
printf(" %c | %c | %c \n", square[7], square[8],square[9]);
printf(" | | \n");
}
【问题讨论】:
-
为什么要递归?我看不出有什么特别的理由来做这个递归。
-
这不是一个尝试递归解决的好问题。递归主要用于嵌套结构。例如,如果您正在搜索一个文件,您可能会调用一个函数来扫描目录以查找它。如果该函数在其中看到一个目录,该函数也会调用自身来检查该目录。对于平面数组,您几乎总是要使用迭代;递归方法通常没有意义。
-
@Broman 不幸的是,这是一个分配要求......我认为这也没有多大意义。
-
你首先必须想出一个递归算法。我认为您正试图在一条直线上找到三个具有相同值的正方形。所以,1)检查当前方块的值,2)然后递归检查所有相邻方块的值,3)然后检查下一个相邻方块的值,方向与步骤 2 相同。你看过这样做吗?
-
@contrapants 我完全同意,但这是一个分配要求,所以我必须确保递归适合该函数。
标签: c recursion iteration global-variables