C语言练习——递归(2)

函数的递归

1..写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和, 
例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19 

#define _CRT_SECURE_NO_WARNINGS
#include
#include

//非递归
int DigitSum_Nd(int num) {
	int Sum = 0;
	Sum = (num % 10) + (num / 10) % 10 + (num / 100) % 10 + (num / 1000);
	return Sum;
}

//递归
int Sum = 0;
int DigitSum(int num) {
		if (num > 9) {
			DigitSum(num / 10);
		}
		return Sum = Sum + (num % 10);
}
int main()
{
	int Num = 0;
	printf("请输入:");
	scanf("%d",&Num);
	//非递归
	printf("%d的每一位的和为:%d\n", Num, DigitSum_Nd(Num));
	//递归
	printf("%d的每一位的和为:%d\n", Num, DigitSum(Num));
    system("pause");
    return 0;   
}

程序的运行结果:

C语言练习——递归(2)_第1张图片

2.递归和非递归分别实现strlen 

       strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')。 

#define _CRT_SECURE_NO_WARNINGS
#include
#include

//非递归
//把数组作为函数的参数
//在C语言中,如果把数组作为函数的参数,就会被隐式转换成指针,指向数组首位元素
int Strlen_Nd(char* str) {
	int i = 0;
	while (str[i] != '\0') {
		++i;
	}
	return i;
}
//递归
//"abcd" => 1 + "bcd"
//"bcd"  => 1 + "cd"
//"cd"   => 1 + "d"
//"d"    => 1 + ""
int Strlen(char* str) {
	if (str[0] == '\0') {
		return 0;
	}
	return 1 + Strlen(str + 1);
}
int main()
{
	char str[] = {0};
	printf("请输入字符串:");
	scanf("%c",&str);
	//非递归
	printf("字符串的长度为:%d\n",Strlen_Nd(str));
	//递归
	printf("字符串的长度为:%d\n", Strlen(str));
    system("pause");
    return 0;   
}

程序运行结果:

C语言练习——递归(2)_第2张图片

3.递归和非递归分别实现求n的阶乘 

#define _CRT_SECURE_NO_WARNINGS
#include
#include

//非递归
int Factor_Nd(int num) {
	int Sum = 1;
	for (int i = 1; i <= num; ++i) {
		Sum = Sum * i;
	}
	return Sum;
}

//递归
//n! => 1*2*3...*n
//=> n * (n-1)!
//(n-1) => (n-1) * (n-2)!
int Factor(int num) {
	if (num == 1) {
		return 1;
	}
	return num * Factor(num - 1);
}
int main()
{
	int Num = 0;
	printf("请输入N的值:");
	scanf("%d",&Num);
	//非递归
	printf("%d ! = %d\n",Num,Factor_Nd(Num));
	//递归
	printf("%d ! = %d\n", Num, Factor(Num));
    system("pause");
    return 0;   
}

程序运行结果;

C语言练习——递归(2)_第3张图片

你可能感兴趣的:(【C/C++】)