递归打印数字

看到一道题,对于一个正整数,按顺序每次打印一位。

如果用递归做,就要看问题能不能分解为同构的子问题:

比如1234,要先打印123,再打印4;接着先打印12,再打印3;先打印1,再打印2.之后剩下12,就把2打印出来,以此类推。

所以可以这样:

#include <iostream>

void PrintOut(unsigned int num){
	if (num >= 10){
		PrintOut(num / 10);
	}
	printf("%2d ", num % 10);
} 
int main(){
	PrintOut(12345);
} 
其实用栈也可以做成迭代形式的:

#include <iostream>
#include <stack>

void PrintOut(unsigned int num){
	std::stack<int> storge;
	int temp = num;
	while (temp >= 10){
		storge.push(temp % 10);
		temp /= 10;
	}
	
	storge.push(temp);
	
	while (!storge.empty()){
		printf("%d", storge.top());
		storge.pop();
	}
} 
int main(){
	PrintOut(12345);
} 

但是就没有递归那么优雅了。

所以俗语有云:用迭代者是人,用递归者是神!

另外还有一个优化的点,mod运算消耗太大。可以用宏 #define MyMod(N) (N)-ceil(N/10)*10 替代。

但是mod运算为毛消耗大,我布吉岛。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值