C语言 递归算法练习(阶乘,斐波那契..)

C语言递归算法练习

文章目录

    • C语言递归算法练习
  • 练习代码
      • N的阶乘
      • 斐波那契数
      • 打印每位数字
      • strlen模拟(测量字符串长度)
      • N的K次方
      • 字符串逆序

   递归是一种算法设计中常用的一种方法,其实就是一个过程或者函数直接或间接调用自己的一种方法。

递归有两个必要条件
(1):存在限制条件,即递归出口;当越来越满足这个条件时,递归便不再继续。
(2):每次递归调用之后越来越接近限制条件。 即子问题规模缩小

 C 语言的函数可以调用函数也可以被调用,所以C语言支持递归,即一个函数可以调用其自身。但在使用递归时,也要注意递归出口和递归规模,否则会进入死循环。 (与C语言内存有关详见链接: link-C语言内存.)

练习代码

N的阶乘

源代码

#include
#include
#pragma warning(disable:4996)

//递归方法
int Factorial(int n)
{
     
	if (n<=1){
     
		return 1;
	}
	else {
     
		return n*Factorial(n - 1);
	}
}

//迭代方法
//int Factorial(int n)
//{
     
//	int i,s=1;
//	for (i = n; i >1; i--)
//	{
     
//		s *= i;
//	}
//	return s;
//}
int main()
{
     
	int num;
	scanf("%d", &num);
	printf("%d! = %d\n", num, Factorial(num));
	system("pause");
	return 0;
}

运行结果:
在这里插入图片描述

斐波那契数

 斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……(我们这里不考虑0的情况直接计算从1开始的斐波那契数)

#define _CRT_SECURE_NO_WARNINGS 1
#include 
#include 
//   //迭代方法
//int Fib(int n)
//{
     
//	int num1 = 1, num2 = 1;
//	int fib;
//	while (n>2){
     
//		n--;
//		fib = num1 + num2;
//		num1 = num2;
//		num2 = fib;
//	}
//}

//  //递归方法
int Fib(int n)
{
     
	if (n <= 2){
     
		return 1;
	}
	else{
     
		return Fib(n - 1) + Fib(n - 2);
	}
}

int main()
{
     
	int number;
	printf("你想知道第几个斐波那契数。\n");
	scanf("%d", &number);
	printf("%d\n", Fib(number));
	system("pause");
	return 0;
}

C语言 递归算法练习(阶乘,斐波那契..)_第1张图片

打印每位数字

接受一个无符号整数并用递归的方式打印每一位。

//接受一个无符号整数并打印每一位。
#include
#include
#pragma warning(disable:4996)     //vs(vs2013)使用scanf时需要加 _s 否则会报错,用这种是解决方法之一

int Print(int num)
{
     
	if (num > 9){
     
		Print(num / 10);           
	}
	printf(" %d ", num % 10);
}

int main()
{
     
	int n;
	printf("请输入一个整数\n");
	scanf("%d", &n);
	printf("%d的每一位是:", n);
	Print(n);
	printf("\n");
	system("pause");       //vs运行会直接结束运行窗口自动关闭,可以用中的syetem函数使运行窗口保留。 
	return 0;
}

C语言 递归算法练习(阶乘,斐波那契..)_第2张图片

strlen模拟(测量字符串长度)

strlen是一种操作函数,用来获取字符串有效长度(不包括字符串结尾的’\0’)。包含在头文件内,具体如下(可以到 C语言.查询)
C语言 递归算法练习(阶乘,斐波那契..)_第3张图片
示例:
C语言 递归算法练习(阶乘,斐波那契..)_第4张图片

#include
#include
#pragma warning(disable:4996)

//   //非递归实现
//int Strlen(char *str)
//{
     
//	int len = 0;
//	while (*str){
     
//		str ++;
//		len++;
//	}
//	return len;
//}
    //递归实现
int Strlen(char *str)
{
     
	if (*str == '\0'){
     
		return 0;
	}
	else {
     
		return 1+Strlen(str+1);
	}
}

int main()
{
     
	char s[100];
	scanf("%s",&s);
	int len = Strlen(s);
	printf("len = %d\n",len);
	system("pause");
	return 0;
}

C语言 递归算法练习(阶乘,斐波那契..)_第5张图片

N的K次方

#include
#include
#pragma warning(disable :4996)

int Square(int n,int k)
{
     
	if (k<=1){
     
		return n;
	}
	else{
     
		return n*Square(n,k - 1);
	}
}
int main()
{
     
	int num,k;
	scanf("%d %d", &num,&k);
	printf("%d的%d次方是%d\n",num,k, Square(num,k));
	system("pause");
	return 0;
}

C语言 递归算法练习(阶乘,斐波那契..)_第6张图片

字符串逆序

利用递归方法对输入字符串进行逆序并输出

#define _CRT_SECURE_NO_WARNINGS 1
#include
#include

void swap(char *p, char *q)
{
     
	*p ^= *q;
	*q ^= *p;
	*p ^= *q;
}

void ReverseStringHelper(char string[], int start, int end)
{
     
	if (start >= end){
     
		return;
	}
	else{
     
		swap(&string[start++], &string[end--]);
		ReverseStringHelper(string, start, end);
	}
}

void ReverseString(char str[]) //NULL ""
{
     
	if (NULL == str || strcmp(str, "") == 0){
     
		return;
	}
	ReverseStringHelper(str, 0, strlen(str) - 1);
}

int main()
{
     
	char str[10] = "0";
	scanf("%s", str);
	//printf("%s\n", str);
	ReverseString(str);
	printf("%s\n", str);
	system("pause");
	return 0;
}

运行结果:
C语言 递归算法练习(阶乘,斐波那契..)_第7张图片

你可能感兴趣的:(c语言,c语言,算法,字符串)