函数的递归
1..写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和,
例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
//非递归
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;
}
程序的运行结果:
2.递归和非递归分别实现strlen
strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
//非递归
//把数组作为函数的参数
//在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;
}
程序运行结果:
3.递归和非递归分别实现求n的阶乘
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
//非递归
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;
}
程序运行结果;