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

Posted -YIN

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言 递归算法练习(阶乘,斐波那契..)相关的知识,希望对你有一定的参考价值。

C语言递归算法练习


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

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

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

练习代码

N的阶乘

源代码

#include<stdio.h>
#include<Windows.h>
#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 <stdio.h>
#include <windows.h>
//   //迭代方法
//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;
}

在这里插入图片描述

打印每位数字

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

//接受一个无符号整数并打印每一位。
#include<stdio.h>
#include<windows.h>
#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运行会直接结束运行窗口自动关闭,可以用<window.h>中的syetem函数使运行窗口保留。 
	return 0;
}

在这里插入图片描述

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

strlen是一种操作函数,用来获取字符串有效长度(不包括字符串结尾的’\\0’)。包含在<string.h>头文件内,具体如下(可以到 C语言.查询)
在这里插入图片描述
示例:
在这里插入图片描述

#include<stdio.h>
#include<Windows.h>
#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;
}

在这里插入图片描述

N的K次方

#include<stdio.h>
#include<windows.h>
#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;
}

在这里插入图片描述

字符串逆序

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

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<windows.h>

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语言 递归算法练习(阶乘,斐波那契..)的主要内容,如果未能解决你的问题,请参考以下文章

C语言用递推和递归两种算法完成斐波那契数列的计算,给一下代码

数据结构与算法—递归(阶乘斐波那契汉诺塔)

08《算法入门教程》递归算法之斐波那契数列

Python基础——递归及其经典例题(阶乘斐波那契数列汉诺塔)

Python基础——递归及其经典例题(阶乘斐波那契数列汉诺塔)

我想用递归写斐波那契数列,c语言