C语言迭代与递归解决相同问题

1. Decryption

问题:输入一个正整数,反序输出其各位数。

我们可以用迭代和递归解决这个问题,其实迭代和递归在很多情况下都能够相互转化。

1.1 使用迭代解决

在这里插入图片描述

1.2 使用递归解决

在这里插入图片描述
使用递归解决时候需要注意的是,输出n%10f(n/10)之前是反序打印,若输出n%10f(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;
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_39643613/article/details/108287090
今日推荐