You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需循环/条件判断生成可重复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;
}

实现说明

  1. 递归逻辑:generate函数负责填充当前位置的数字,每填充一个位置就递归处理下一个位置,直到填满4位(pos == 4)。
  2. 短路求值替代条件判断:利用&&运算符的短路特性——当左侧表达式为假时,右侧表达式不会执行。比如pos == 4 && (...),只有当pos等于4时才会执行输出语句;pos < 4 && (...)则确保只有还没填满4位时才会继续递归。
  3. 避免循环/条件语句:整个实现没有使用for/while循环,也没有if/else语句,完全符合需求。

这种方法的扩展性也更好,如果需要生成n位组合,只需要调整current数组长度和递归终止条件即可,无需手动编写所有组合的输出语句。

内容的提问来源于stack exchange,提问作者Saki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 23:43:25