递归及相关习题
Posted 麋璐
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归及相关习题相关的知识,希望对你有一定的参考价值。
今天我要讲述的主要是递归的习题,另外还有我对其知识的理解。
首先我要介绍的的递归,程序调用自身的编程技巧称为递归( recursion)。 递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。 递归的主要思考方式在于:把大事化小。
递归的必须满足两个条件:
1,存在限制条件,当满足这个限制条件的时候,递归便不再继续。
2,每次递归调用之后越来越接近这个限制条件。
下面我将给大家分享一下我做的几道题
1,递归实现strlen
int my_strlen(char* arr)
{
if (*arr != \'\\0\')
{
return 1 + my_strlen(arr + 1);
}
else
{
return 0;
}
}
int main()//实现strlen
{
int j = 0;
char arr[] = "abcdef";
int count = my_strlen(arr);
printf("count=%d\\n", count);
return 0;
}
int main()//非递归实现strlen
{
int i = 0;
int count = 0;
char arr[] = "abcdef";
while (arr[i] != \'\\0\')
{
count++;
i++;
}
printf("count=%d\\n", count);
return 0;
}
这个应该是最简单的递归练习题了,strlen作为系统给定的函数,是用来计算字符串长度的。而我们在这里要创造自己的函数去实现它,它的做法就是将一个个字符和\'\\0\'去对比,不是\'\\0\'就使和+1。
2,编写一个函数实现n的k次方,使用递归实现
int Flort(int n,int k)
{
if (k == 1)
{
return n;
}
else
{
return n*Flort(n, k - 1);
}
}
int main()
{
int n = 0;
int k = 0;
int w = 0;
scanf("%d%d", &n, &k);
w = Flort(n, k);
printf("result=%d", w);
return 0;
}
这道题我在做的时候也是出现过一个问题,就是在进行算法编写的时候,我去把n分为了1或者大于1,本来是不讨论k的。但是在调试的时候发现,在第一种情况,根本就没有考虑n的阶乘;而在第二种情况,n并没有发生改变。我们说过,递归的进行会越来越靠近限制条件,这就犯了致命的错误,我在书写return n*Flort(n,k-1)时,只减少了k的数值,n没有变化;而对应题意,就是在n不变得情况下,减小k的值。
3,将参数字符串中的字符反向排列,不是逆序打印
#include<string.h>
void reverse_string(char string[])
{
int len = strlen(string);//字符串长度为6
int i = 0;
if (len < 2)
{
return string;
}
else
{
char temp = string[i];//temp=a
string[i] = string[len - 1];//a=f
string[len - 1] = \'\\0\';//f=\\0
reverse_string(string + 1);
string[len - 1] = temp;
}
}
int main()
{
char string[] = "abcdef";
reverse_string(string);
printf("%s\\n", string);
return 0;
}
这道题的大意是将字符串abcdef转换成fedcba,用递归方式实现。最主要的就是在算法中出现的递归情况
char temp = string[i];//temp=a
string[i] = string[len - 1];//a=f
string[len - 1] = \'\\0\';//f=\\0
reverse_string(string + 1);
string[len - 1] = temp;
这几行的解释就是先将a赋给temp,再将f赋给a;最后在将\\0赋给f,第一次递归字符串就变成了bcde,len变为4,每次递归都是如此;所有递归进行完后,字符串变为fed,之后返虚,先释放temp中的c,在释放b,最后是a,就可以输出fedcba。
这个题最主要的就是理解递归的实质,就相当于我们开辟不同的空间多次调用一个函数组,并且每个函数组所有的temp赋值可以不同,这也就解决了temp赋值被覆盖的情况。
今天的分享就到这里,希望大家可以多多支持!!!
以上是关于递归及相关习题的主要内容,如果未能解决你的问题,请参考以下文章