(一).使用函数递归来不创建临时变量求字符串的长度
步骤一:大事化小 。如求”hello”的长度。
步骤二:分析
1.由于是求字符串的长度,所以使用数组会很方便。创建一个arr数组用来存放hello这个字符串。
2.每次取出数组中的一个元素,只要该元素不为0,那么就说明该字符串的长度应该加一。
结构体函数代码:如下
int my_strlen(char* str)//形参为指针,指向数组中的元素
{
if (*str != 0)
return 1 + my_strlen(str + 1);//只要该数组的元素不为0,就返回值加一
else
return 0;
}
步骤三:调用
#include<stdio.h>
int my_strlen(char* str)
{
if (*str != 0)
return 1 + my_strlen(str + 1);
else
return 0;
}
int main()
{
char arr[] = "hello";
int l = 0;
l = my_strlen(arr);
printf("%d", l);
return 0;
}
(二)递归与迭代
1.迭代:也就是循环来求解问题:比如求n的阶乘
部分代码如下
for (int i = 0;i <= n;i++)
{
e = e * i;//初始化e为1即可
}
2.递归:函数自己调用自己
两个方法的选择:应该择优而选,总的来说各有优势。比如使用迭代会简化代码的数量,但是
会加大计算,迭代计算效率会高很多。如下求斐波那契数列的第n项数。
步骤一:思路分析:
1. 斐波那契数列形式为 1 1 2 3 5 8 13 21 34 55.... 也就是除了第一二个数外其余的数为前两个相加。则第n个就分为n<=2和n>2来计算
2.具体如图:
递归:
代码如下:
#include<stdio.h>
int fib(int x)
{
if (x <= 2)
return 1;//当前两项的时候返回值为1
else
return fib(x - 1) + fib(x - 2);//n>2的时候返回值为前面数的加和
}
int main()
{
int n = 0;
scanf_s("%d", &n);
int m = fib(n);
printf("%d", m);
return 0;
}
可以看出此代码的缺点很明显,就是进行了大量的重复计算,具体可以加一些代码来验证
如在执行体函数中加上如下代码来看重复次数:
if(x==3)
count ++;
具体如下:可以看出仅仅第20个数的时候,3就被计算了上千次,所以效率是不高的,可以自己试一试,输入n=40~50,会需要一定的时间才会出结果。
迭代:
原理分析如下图:
也就是定义a,b,c,初始化a=1,b=1,c=a+b。然后使用循环交换a,b,c的值。
具体代码如下:
#include<stdio.h>
int fib(int n)
{
int a = 1;
int b = 1;
int c = 1;
while (n >= 2)//只有当n比2大的时候才会进行该计算
{
c = a + b;
a = b;
b = c;
n--;
}
return c;//当n比2小的时候,就会返回c的值即为1
}
int main()
{
int n = 0;
scanf_s("%d", &n);
int m = fib(n);
printf("第%d个斐波那契数为:%d\n",n, m);
return 0;
}
上述用迭代的方法是很快的,但缺点就是代码数量多。