函数递归,接收无符号整型数,按顺序打印每一位.

在学习函数递归之前,我们先来了解什么是递归.
递归说得简单一些,其实就是一种程序员调用自身的编程技巧.在我们的程序设计语言当中,递归作为一种算法应用十分广泛,一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,他通常能把一个 大型复杂的问题层层转化一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,可以有效减少代码量.
递归思考的主要方式是:把大事化小.
递归的两个必要条件:
递归存在限制条件,当满足这个限制条件的时候,递归就不在继续.
每次递归调用之后会越来越接近这个限制条件.
我们从具体例子中来看递归调用的思想及方法.
从键盘上接收一个无符号的整型值,然后按照顺序打印它的每一位.比如输入1234,就打印1 2 3 4.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

void Print(int n){
	if (n > 9){
		Print(n / 10);
	}
	printf("%d ",n % 10);
}

int main(){
	int number;
	printf("请输入一个整数: \n");
	scanf("%d",&number);
	Print(number);
	system("pause");
	return 0;
}

接下来我们来看上述代码中所用到的递归思想.
首先我们给一个1234这样的值,这个值在Print函数中,首先判断1234>9,进入if语句执行Print(1234/10)(即Print(123)),这个时候本应执行if语句外

printf("%d ",number);

但是我们要注意,if语句中是

Print(123);

这也就意味着,if语句中又在调用自身Print函数,而不是直接执行

printf("%d ",number % 10);

接下来是这个函数不断调用自身的整体逻辑.
首先输入1234,判断(1234 > 9)成立执行Print(1234 / 10),即Print(123),此时应该先看Print(123),就相当于我们又输入了123,开始判断(123 > 9)成立,就执行Print(123 / 10)即Print(12),和上一部一样,接着判断Print(12 / 10),即Print(1),此时(1 > 9)不成立,所以不会再去执行if语句中的Print(1 / 10),直接按顺序执行if语句之外的语句即

printf("%d ",number % 10);

这样我们就打印出了1.
这个时候要注意,按照之上的逻辑思维我们现在打印出了1,接下来是这个递归思想最重要的地方!
回想一下我们每次进来一个number在执行完if语句之后都应该执行printf语句,但由于if语句中不断在调用自身这个Print函数,所以在我们打印出了1之后,前面还留着
printf("%d “,1234% 10);
printf(”%d “,123 % 10);
printf(”%d “,12% 10);
这些语句并没有执行,这就是说printf(”%d “,1234% 10)这个语句是我们第一次留下的,后面依次为第二次,第三次留下的,1是最后依次也就是第四次打印出来的,也就是说在打印1之前留下的语句是printf(”%d “,12% 10),按照顺序最后留下的语句(printf(”%d “,1234% 10))是距离打印1最近的,所以要先执行printf(”%d “,12% 10),打印出2,反而最开始留下的printf(”%d ",1234% 10)语句处于整个函数定义的最外层,说得简单一些就是处于最后一行.这样也就利用递归完成了这道题的目的.
我个人也正处于C语言的学习阶段,文中的描述可能不是那么专业,是我对这道题递归的一些理解,希望能对大家理解递归有些帮助,不好的地方希望大家能够批评指正.

猜你喜欢

转载自blog.csdn.net/weixin_44781107/article/details/89046125