【C语言初阶练习题-递归函数】递归计算斐波那契数,递归实现n的k次方,递归实现一个数的每位之和,递归实现字符串逆序,递归实现strlen的模拟,递归求阶乘,递归方式实现打印一个整数的每一位

递归计算斐波那契数

// 求第n个斐波那契 递归
 //1 1 2 3 5 8 13 21
int Fib(int n)
{
   if (n<=2)
      return 1;
   else
      return Fib(n - 1) + Fib( n - 2);
}
//非递归
int Fib(int n)
{
   int a = 1;
   int b = 1;
   int c = 1;
   while (n >= 3)
   {
      c = a + b;
      a = b;
      b = c;
      n--;
   }
   return c;
}

int main()
{
   int n;
   scanf("%d", &n);
   int ret = Fib(n);
   printf("%d\n",ret);
   
   return 0;
}

递归实现n的k次方

思路:Pow(n,k)有三种情况
1.k > 0     n * Pow(n,k-1)
2.k = 0     1
3.k < 0      1.0/Pow(2,-k)
double Pow(int n,int k)
{
   if (k > 0)
      return n * Power(n, k - 1);
   else if
      return 1;
   else
   	  return 1.0/Pow(n,-k);
}

int main()
{
   int n = 0;
   int k = 0;
   scanf("%d %d", &n,&k);
   int ret = Pow(n,k);
   printf("%d\n", ret);

   return 0;
}

递归实现一个数的每位之和

思路:写一个函数DigitSum(n)
DigitSum(1729)
DigitSum(172) +9
DigitSum(17)+2 +9
DigitSum(1)+7+2 +9

int DigitSum(unsigned int n)
{
   if (n > 9)
   {
      DigitSum(n / 10);
      return DigitSum(n / 10) + n % 10;
   }
   else
      return n;
}

int main()
{
   unsigned int n = 0;
   scanf("%d", &n);
   int ret = DigitSum(n);
   printf("%d", ret);
   return 0;

}

递归实现字符串逆序

编写一个函数 reverse_string(char * string)(递归实现)
实现:将参数字符串中的字符反向排列,不是逆序打印。
要求:不能使用C函数库中的字符串操作函数。

#include <stdio.h>
#include <string.h>
//非递归
//void reverse_string(char s[])
//{
	//size_t len = strlen(s);
	//size_t left = 0;
	//size_t right = len - 1;
	//while (left<right)
	//{
	//	char tmp = s[left];
	//	s[left] = s[right];
	//	s[right] = tmp;
	//	left++;
	//	right--;
	//}
//}
//递归
void reverse_string(char s[])
{
	size_t len = strlen(s);
	char tmp = s[0];
	s[0] = s[len - 1];
	s[len - 1] = '\0';
	if (strlen(s+1)>=2)
		reverse_string(s + 1);
	s[len - 1] = tmp;
}

int main()
{
	char arr[] = "abcdef";
	reverse_string(arr);
	printf("%s\n", arr);

	return 0;
}

递归实现strlen的模拟

size_t My_strlen(char* str)
{
   if (*str == '\0')
      return 0;
   else
      return 1 + My_strlen(str+1);
}
//非递归
//size_t My_strlen(char* str)
//{
//   size_t count = 0;
//   while (*str != '\0')
//   {
//      count++;
//      str++;
//   }
//   return count;
//}
int main()
{
   char arr[] = "abc";
   size_t len = My_strlen(arr);
   printf("%zd\n", len);

   return 0;
}

递归求阶乘

#include <stdio.h>
//递归
//int Fac(int n)
//{
//   if (n <= 1)
//      return 1;
//   else
//      return n* Fac(n - 1);
//}
int Fac(int n)
{
   int i = 0;
   int x = 1;
   for ( i = 1; i <= n; i++)
   {
      x = i * x;
   }
   return x;
}
int main()
{
   int n = 0;
   scanf("%d", &n);
   int ret = Fac(n);
   printf("%d\n", ret);

   return 0;
}

递归方式实现打印一个整数的每一位

void Print(int n)
{
   if (n > 9)
      Print(n / 10);
   printf("%d ", n % 10);
}
int main()
{
   int num = 0;
   scanf("%d", &num);
   Print(num);
   return 0;

}
  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值