您可以申请递归.这个函数的原型就像:
print_digits(int num_of_remaining_digits,int start_from_digit, int current_number);
Run Code Online (Sandbox Code Playgroud)
编辑:为了完成,我在这里介绍我的解决方案(我认为它比Ben Voigt和输出订单上升具有更好的可读性
void print_digits(int num_of_remaining_digits,int start_from_digit, int current_number)
{
if(num_of_remaining_digits == 0)
{
std::cout << current_number << std::endl;
return;
}
for(int i=start_from_digit;i<=9;i++)
{
print_digits(num_of_remaining_digits-1,i,10*current_number+i);
}
}
Run Code Online (Sandbox Code Playgroud)
这是测试代码
这是怎么回事?
它是递归中的经典之一.首先是停止状态.然后是主循环.
主循环从哪里开始,start_from_digit
因为所有生成的数字将以非递减顺序.举例来说,如果current_number
是15
,它会调用print_digits
蒙山
print_digits(num_of_remaining_digits-1,5,155)
print_digits(num_of_remaining_digits-1,6,156)
print_digits(num_of_remaining_digits-1,7,157)
print_digits(num_of_remaining_digits-1,8,158)
print_digits(num_of_remaining_digits-1,9,159)
Run Code Online (Sandbox Code Playgroud)
在每个电话中,它将检查我们是否达到了结束白色num_of_remaining_digits
,如果没有,将继续从被推送的数字start_from_digit
(第二个参数)继续使用current_number