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

函数的递归

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;   
}

程序运行结果;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_ClivenZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值