首先,我们要知道函数递归的使用条件。它有两个条件:
1.存在限制条件,当满足这个条件是便不再继续。2.每次调用函数之后会越来越接近这个限制条件。
同时我们要抓住先递再归的核心,并且我觉得应该找到前一次和后一次的关系。接下来,就来到了一些应用
首先,我们要知道n阶乘是什么。n!=n*(n-1)*(n-2)*...*2*1 所以,这里我们应该知道怎么写了吧。代码如下:
#include
int fac1(int n)
{
if (n <= 1)
{
return 1;
}
else
{
return n * fac1(n - 1);
}
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = fac1(n);
printf("%d\n", ret);
return 0;
}
同时,我们应该还可以想到实现n的阶乘不只可以用递归还可以用循环,在这里我也写出来。代码如下:
#include
int fac2(int n)
{
int i = 0,a=1;
for (i = 1; i<=n; i++)
{
a *= i;
}
return a;
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = fac2(n);
printf("%d\n", ret);
return 0;
}
这里,我们就拿1234来作为例子。要想打印个位则1234%10即可,之后我们要想打印3,该怎么办呢,其实这里只用把4去掉继续打印个位即可,要去掉个位应该1234/10,所以我们就写出来了。代码如下:
#include
void print(int n)
{
if (n <= 9)
{
printf("%d", n);
}
else
{
printf("%d ", n % 10);
print(n / 10);
}
}
int main()
{
int n = 0;
scanf("%d", &n);
print(n);
return 0;
字符串结束标志为\0,所以我们会用到指针来实现,让指针依次向后移一位,直到其值为\0为止,此时结束递归。
#include
int my_strlen(char* arr)
{
if (*arr != '\0')
return 1 + my_strlen(arr + 1);
else
return 0;
}
int main()
{
char arr[] = "Jackson";
int len = my_strlen(arr);
printf("%d", len);
return 0;
}
求字符串长度还可以用到循环加计数器的方法,这里我也把代码写出来
#include
int my_strlen(char* arr)
{
char* left = arr;
char* right = arr;
while (*right != '\0')
{
right++;
}
return right - left;
}
int main()
{
char arr[] = "Jackson";
int len = my_strlen(arr);
printf("%d", len);
}
首先,我们要知道斐波那契数是什么。他是从第三项开始,每一项等于前两项的和,前两项为1。所以第n个斐波那契数等于n-1和n-2的斐波那契数,以此类推,我们就知道这个递归怎么写了。代码如下:
#include
int Fib(int n)
{
if (n <= 2)
return 1;
else
return Fib(n - 1) + Fib(n - 2);
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = Fib(n);
printf("%d", ret);
return 0;
}
但是,但我们输入较大的数时可以看到,要等一段时间结果才能出来,所以用递归求斐波那契数不是最好的方法,其时间和空间消耗都大。
其实,这里用循环较好一点。代码如下:
#include
int Fib(int n)
{
int a = 1, b = 1, c = 1;
while (n > 2)
{
c = a + b;
a = b;
b = c;
n--;
}
return c;
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = Fib(n);
printf("%d", ret);
return 0;
}
至此,我想举的例子都写完了。通过这些例子,大家应该都对递归有了更好的掌握。
祝:“码”思泉涌,下“指”如有神。