Я не понимаю, почему кто-то хотел бы сделать это рекурсивным. Но это работает.
#include <stdio.h>
void recurse(int i, int j, int n){
printf(i==j || i+j+1==n ? "X" : " ");
if (++j == n) {
printf("\n");
if (++i == n)
return;
j=0;
}
recurse(i, j, n);
}
int main(){
int n;
printf("Enter width: ");
scanf("%d",&n);
recurse(0, 0, n);
return 0;
}
Если вы заметите, я перемещаю один if
блок прямо внутри оператора printf
, используя оператор ? :
.
Кроме того, обратите внимание, что каждый printf
вызывается из своего собственного recurse
вызова функции, который находится поверх любого другого вызова функции в стеке. Поэтому, если ваш стек ограничен и n
велик, вы можете выйти из стека и потерпеть крах. Это одна из причин, по которой рекурсивные функции следует использовать только с осторожностью.
В качестве альтернативы, вы можете поместить цикл, который увеличивает j
в рекурсивную функцию, и только рекурсивно увеличивать i
. Это будет использовать намного меньше стека.