1. Decryption
问题:输入一个正整数,反序输出其各位数。
我们可以用迭代和递归解决这个问题,其实迭代和递归在很多情况下都能够相互转化。
1.1 使用迭代解决
1.2 使用递归解决
使用递归解决时候需要注意的是,输出n%10
在f(n/10)
之前是反序打印,若输出n%10
在f(n/10)
之后是正序打印了。
在思考递归过程时候,结合函数与分配的栈空间理解起来会容易的多。
即系统调用函数时会分配一段栈帧,这段栈帧用于临时变量的保存、现场的保护(函数的返回值和参数、调用前寄存器的状态,调用前栈帧的顶部和底部的地址)。然后再执行函数指令,以及结束函数时会回收掉这一段栈帧。
2. Code
迭代解决:
#include<stdio.h>
int main(void) {
long long int x;
printf(">请输入一个正整数: ");
scanf("%lld", &x);
while (x > 0) {
printf("%lld ", x % 10);
x = x / 10;
}
return 0;
}
递归解决:
#include<stdio.h>
void f(long long int x);
int main(void) {
long long int x;
printf(">请输入一个正整数: ");
scanf("%lld", &x);
f(x);
return 0;
}
void f(long long int x) {
if (x > 0) {
printf("%lld ", x % 10);
f(x / 10);
}
else
return;
}
3. Show
输出结果皆为:
4. More 1:正序打印
我们尝试一下像1.2中所说的,把输出n%10
放在f(n/10)
之后进行正序打印。
#include<stdio.h>
void f(long long int x);
int main(void) {
long long int x;
printf(">请输入一个正整数: ");
scanf("%lld", &x);
f(x);
return 0;
}
void f(long long int x) {
if (x > 0) {
f(x / 10);
printf("%lld ", x % 10);
}
else
return;
}
5. More 2:递归实现十进制转二进制
十进制转二进制方法为:整数部分除2取余,小数部分乘2取整。
例如十进制数38转二进制:100110。
我们修改下4.
中的代码即可实现,将/10
与%10
改为/2
与%2
。
#include<stdio.h>
void f(long long int x);
int main(void) {
long long int x;
printf(">请输入一个正整数: ");
scanf("%lld", &x);
f(x);
return 0;
}
void f(long long int x) {
if (x > 0) {
f(x / 2);
printf("%lld ", x % 2);
}
else
return;
}