无需循环/条件判断生成可重复4位数字组合:能否简化实现?
无循环/条件语句生成4位数字组合的简洁实现
问题描述
输入四个数字a、b、c、d,需要生成所有允许重复数字的4位组合,且禁止使用循环或if-else语句。当前实现是逐个编写printf语句输出所有组合,这种方式繁琐且扩展性差,有没有更简洁的实现方式?
当前示例代码片段:
printf("All possible 4-digit numbers:\n"); printf("%d%d%d%d\n", a, a, a, a); printf("%d%d%d%d\n", a, a, a, b); printf("%d%d%d%d\n", a, a, a, c); printf("%d%d%d%d\n", a, a, a, d); printf("%d%d%d%d\n", a, a, b, b); printf("%d%d%d%d\n", a, a, b, c); // ... 剩余所有组合的printf语句
解决方案:递归+短路求值
可以用递归遍历所有位置的数字选择,同时利用逻辑运算的短路求值特性替代if判断终止条件,完全符合要求。
示例代码(C语言):
#include <stdio.h> // 存储输入的四个数字 int digits[] = {0}; // 存储当前正在构建的组合 int current[4]; // 递归函数:pos表示当前要填充的位置(从0到3) void generate(int pos) { // 当pos == 4时,短路求值不会执行后面的递归,直接输出组合 pos == 4 && (printf("%d%d%d%d\n", current[0], current[1], current[2], current[3]), 0); // 遍历四个数字,递归填充下一个位置 pos < 4 && (current[pos] = digits[0], generate(pos+1), 0); pos < 4 && (current[pos] = digits[1], generate(pos+1), 0); pos < 4 && (current[pos] = digits[2], generate(pos+1), 0); pos < 4 && (current[pos] = digits[3], generate(pos+1), 0); } int main() { int a, b, c, d; printf("Enter four digits: "); scanf("%d %d %d %d", &a, &b, &c, &d); digits[0] = a; digits[1] = b; digits[2] = c; digits[3] = d; printf("All possible 4-digit numbers:\n"); generate(0); return 0; }
实现说明
- 递归逻辑:
generate函数负责填充当前位置的数字,每填充一个位置就递归处理下一个位置,直到填满4位(pos == 4)。 - 短路求值替代条件判断:利用
&&运算符的短路特性——当左侧表达式为假时,右侧表达式不会执行。比如pos == 4 && (...),只有当pos等于4时才会执行输出语句;pos < 4 && (...)则确保只有还没填满4位时才会继续递归。 - 避免循环/条件语句:整个实现没有使用
for/while循环,也没有if/else语句,完全符合需求。
这种方法的扩展性也更好,如果需要生成n位组合,只需要调整current数组长度和递归终止条件即可,无需手动编写所有组合的输出语句。
内容的提问来源于stack exchange,提问作者Saki
相关产品推荐
相关产品推荐

