C语言 递归算法及简单递归练习总结

递归

:大师 L. Peter Deutsch 说过:To Iterate is Human, to Recurse, Divine.中文译为:人理解迭代,神理解递归。
简单理解:
递归:你打开面前这扇门,看到屋里面还有一扇门。你走过去,发现手中的钥匙还可以打开它,你推开门,发现里面还有一扇门,你继续打开它。若干次之后,你打开面前的门后,发现只有一间屋子,没有门了。然后,你开始原路返回,每走回一间屋子,你数一次,走到入口的时候,你可以回答出你到底用这你把钥匙打开了几扇门。
   循环:你打开面前这扇门,看到屋里面还有一扇门。你走过去,发现手中的钥匙还可以打开它,你推开门,发现里面还有一扇门(若前面两扇门都一样,那么这扇门和前两扇门也一样;如果第二扇门比第一扇门小,那么这扇门也比第二扇门小,你继续打开这扇门,一直这样继续下去直到打开所有的门。但是,入口处的人始终等不到你回去告诉他答案。
  
详细参考添加链接描述

递归:函数调用自身的编程技巧
人理解迭代,神理解递归。毋庸置疑地,递归确实是一个奇妙的思维方式。
递归的两个必要条件
1、存在限制条件,当满足这个条件时,递归便不再继续。
2、每次递归调用之后越来越接近这个限制条件。

1.递归和非递归分别实现求第n个斐波那契数。

斐波纳契数列fibonacci,又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……
在数学上,斐波纳契数列以如下被以递归的方法定义:
//F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)。

递归实现斐波那契数C程序

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int fibonacci(int n)
{
	if(n <= 2)
	{
		return 1;
	}
	else
	{
	    return fibonacci(n - 1) + fibonacci(n - 2);
    }
}
int main()
{
	int n;
	printf("请输入你想输出第几项的斐波那契数:\n");
	scanf("%d", &n);
	printf("%d\n", fibonacci(n));
	system("pause");
	return 0;
}

运行结果:
在这里插入图片描述
不用递归实现斐波那契数C程序

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int fibonacci(int n)
{
	int result = 0;
	int a = 1;
	int b = 1;
	int i;
	if(n <= 2)
	{
		return 1;
	}
	for(i = 3; i <= n; i++)
	{
		result = a + b;
		a = b;
		b = result;
	}
	return result;
}
int main()
{
	int n;
	printf("请输入你想输出第几项的斐波那契数:\n");
	scanf("%d", &n);
	printf("%d\n", fibonacci(n));
	system("pause");
	return 0;
}

2.编写一个函数实现n^k,使用递归实现

//n^k相当于k次 n*n*...*n,函数传递两个参数,k用来判断返回,k自减!
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int power(int n, int k)
{
	if(k == 0)
	{
		return 1;
	}
	if(k == 1)
	{
		return n;
	}
	return n * power(n, k - 1);
}
int main()
{
	int n;
	int k;
	printf("请输入要打印的n的k次方:\n");
	scanf("%d %d", &n, &k);
	printf("%d\n", power(n, k));
	system("pause");
	return 0;
}

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

3. 写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和,
例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19

#include <stdio.h>
#include <stdlib.h>
int DigitSum(int n)
{
	if(n == 0)
	{
		return 0;
	}
	return n % 10 + DigitSum(n/10);
}
int main()
{
	printf("%d\n", DigitSum(1729));
	system("pause");
	return 0;
}

运行结果:
19
请按任意键继续. . .

  1. 编写一个函数 reverse_string(char * string)(递归实现)
    实现:将参数字符串中的字符反向排列。
    要求:不能使用C函数库中的字符串操作函数。
#include <stdio.h>
#include <stdlib.h>
void reverse_string(char * str)
//*str传递的是字符串首字符的地址(指向首地址的指针)
{
	if(*(++str) != '\0')
	{
		reverse_string(str);
	}
	printf("%c", *(str - 1));
}
int main()
{
	char* ch = "abcdefg";
	printf("翻转前的字符串:%s\n", ch);
	printf("翻转后的字符串:");
	reverse_string(ch);
	printf("\n");
	system("pause");
	return 0;
}

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

5.递归和非递归分别实现strlen

#include <stdio.h>
#include <stdlib.h>
int Strlen(char* str)
{
	if(*str == '\0')
	{
		return 0;
	}
	return 1 + Strlen(str + 1);
}
int main()
{
	char* ch = "abcdefg";
	int len = Strlen(ch);
	printf("%d\n", len);
	system("pause");
	return 0;
}

运行结果:
7
请按任意键继续. . .

6.递归和非递归分别实现求n的阶乘

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int Factor(int n)
{
	if( n <= 1)
	{
		return 1;
	}
	return n * Factor(n - 1);
}
int main()
{
	int n;
	printf("请输入要计算的阶乘数:\n");
	scanf("%d", &n);
	printf("%d\n", Factor(n));
	system("pause");
	return 0;
}

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

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

#include <stdio.h>
#include <stdlib.h>
void Print(int a)
{
	if(a > 9)
	{
		Print(a / 10);
	}
	printf("%d ", a % 10);
}
int main()
{
	int a = 123456789;
	Print(a);
	printf("\n");
	system("pause");
	return 0;
}

运行结果:
1 2 3 4 5 6 7 8 9
请按任意键继续. . .

  • 264
    点赞
  • 1102
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值