函数递归练习

目录

1.模拟实现一个strlen函数计算字符串长度

①普通

②使用函数递归(不新建临时变量)

 2.递归实现阶乘

3.递归实现斐波那契数列 (每一项都是前两项之和)

4.实现字符串倒序输出


1.模拟实现一个strlen函数计算字符串长度

①普通

int my_strlen(char* str) {
	int count = 0;
	while (*str !='\0') {
		count++;
		str++;
	}
	return count;
}
int main() {
	char arr[] = "Yoshikitty";
	printf("%d", my_strlen(arr));
	return  0;
}

②使用函数递归(不新建临时变量)

        *str表示字符的地址,+1表示跳到第二个字符的地址

int my_strlen(char* str) {
	if (*str !='\0') 
		return 1+my_strlen(str+1);
	else
		return 0;
}
int main() {
	char arr[] = "HideForever";//ctrl+D复制上行
	printf("%d", my_strlen(arr));
	return  0;
}

 

 2.递归实现阶乘

int jiecheng(int x) {
	if (x <= 1)
		return 1;
	else
		return x * jiecheng(x - 1);
}

int main() {
	int ret = 0;
	scanf("%d", &ret);
	int sum = jiecheng(ret);
	printf("%d的阶乘为:%d", ret, sum);
	return 0;
}

3.递归实现斐波那契数列 (每一项都是前两项之和)

int fab(int n) {
	if (n <= 2)
		return 1;
	else
		return fab(n - 1) + fab(n - 2);
}

int main() {
	int a = 1;
	while (a < 5) {
		int ret = 0;
		printf("请输入一个数: ");
		scanf("%d", &ret);
		int sum = fab(ret);
		printf("第%d次  斐波那契数列的第%d项为:%d\n",a, ret, sum);
		a++;
	}
	
	return 0;
}

 不足之处:无法计算过大的数,会重复计算

 当计算第四十个斐波那契数时,计算了n次fab(3),工程量庞大!

修改:c为前两项a+b,算出后重新赋值

int fab2(int n) {
	int a = 1;
	int b = 1;
	int c = 1;
	while (n>2) {
		c = a+b;
		a = b;
		b = c;
		n--;
	}
	return c;
}

4.实现字符串倒序输出

int mylen(char* str) {
	int count = 0;
	while (*str!='\0')
	{
		count++;
		str++;
	}
	return count;
}
void nixu(char* str) {
	char tmp;
	int left = 0;
	int right = mylen(str)-1;
	while (left < right) {
		tmp = str[left];
		str[left] = str[right];
		str[right] = tmp;
		left++;
		right--;
	}

}
int main() {
	char arr[] = "abcdef";
	nixu(arr);
	printf("%s", arr);
	return 0;
}

5.计算每一位数之和

int digitsum(int n) {
	if (n > 9) {
		return digitsum(n / 10)+n%10;
	}
	return n;
}

int main() {
	int num = 1729;
	int sum = digitsum(num);
	printf("%d", sum);

}

6.用递归实现n的k次方相乘

double Pow(int n, int k) {
	if (k > 0)
		return n * Pow(n, k - 1);//n的k次方= n * Pow(n, k - 1)
	else if(k<0)//考虑正负数
		return 1.0/ (Pow(n,-k ));
	else
		return 1;
}
int main() {
	int  n = 0;
	int k = 0;
	scanf("%d %d", &n,&k);
	double ret = Pow(n,k);
	printf("%lf", ret);
}

 

好的,以下是一些 C++ 中的递归函数练习题: 1. 编写一个递归函数,计算 n 的阶乘 ```cpp int factorial(int n) { if (n == 0) { return 1; } else { return n * factorial(n - 1); } } ``` 2. 编写一个递归函数,计算斐波那契数列的第 n 项 ```cpp int fibonacci(int n) { if (n == 0 || n == 1) { return n; } else { return fibonacci(n - 1) + fibonacci(n - 2); } } ``` 3. 编写一个递归函数,计算一个数字的二进制表示中 1 的个数 ```cpp int countOnes(int n) { if (n == 0) { return 0; } else { return (n % 2 == 1) + countOnes(n / 2); } } ``` 4. 编写一个递归函数,计算一个数字的反转 ```cpp int reverse(int n) { if (n < 10) { return n; } else { return (n % 10) * pow(10, floor(log10(n))) + reverse(n / 10); } } ``` 5. 编写一个递归函数,计算一个字符串的长度 ```cpp int stringLength(string str) { if (str == "") { return 0; } else { return 1 + stringLength(str.substr(1)); } } ``` 6. 编写一个递归函数,判断一个字符串是否是回文字符串 ```cpp bool isPalindrome(string str) { if (str.length() <= 1) { return true; } else if (str[0] != str[str.length() - 1]) { return false; } else { return isPalindrome(str.substr(1, str.length() - 2)); } } ``` 7. 编写一个递归函数,计算一个数组中所有元素的和 ```cpp int arraySum(int arr[], int size) { if (size == 0) { return 0; } else { return arr[0] + arraySum(arr + 1, size - 1); } } ``` 8. 编写一个递归函数,计算一个数组中所有元素的平均值 ```cpp double arrayAverage(int arr[], int size) { if (size == 0) { return 0; } else { return (arr[0] + (size - 1) * arrayAverage(arr + 1, size - 1)) / size; } } ``` 9. 编写一个递归函数,计算一个数组中的最大值 ```cpp int arrayMax(int arr[], int size) { if (size == 1) { return arr[0]; } else { return max(arr[0], arrayMax(arr + 1, size - 1)); } } ``` 10. 编写一个递归函数,计算一个数组中的最小值 ```cpp int arrayMin(int arr[], int size) { if (size == 1) { return arr[0]; } else { return min(arr[0], arrayMin(arr + 1, size - 1)); } } ``` 希望这些练习题能够帮助你练习 C++ 中的递归函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值