关于C语言中的递归函数

递归实例:

#include <stdio.h>

void up_and_down(int);

int main(void)
{ 
	up_and_down(1);
	return 0;

} 
void up_and_down(int n)
{
	printf("Level %d: n location %p\n", n, &n); // #1
	if (n < 4)
		up_and_down(n + 1);
	printf("LEVEL %d: n location %p\n", n, &n); // #2
}

a. 每级函数调用都有自己的变量。 也就是说, 第1级的n和第2级的n不同, 所以程序创建了4个单独的变量, 每个变量名都是n, 但是它们的值各不相同。 当程序最终返回 up_and_down()的第1 级调用时, 最初的n仍然是它的初值1。

b. 每次函数调用都会返回一次。 当函数执行完毕后, 控制权将被传回上一级递归。 程序必须按顺序逐级返回递归, 从某级up_and_down()返回上一级的up_and_down(), 不能跳级回到main()中的第1级调用。

c. 递归函数中位于递归调用之前的语句, 均按被调函数的顺序执行。 
d. 递归函数中位于递归调用之后的语句, 均按被调函数相反的顺序执行。 
e. 虽然每级递归都有自己的变量, 但是并没有拷贝函数的代码。 程序按顺序执行函数中的代码, 而递归调用就相当于又从头开始执行函数的代码。 除了为每次递归调用创建变量外, 递归调用非常类似于一个循环语句。实际上, 递归有时可用循环来代替, 循环有时也能用递归来代替。

f.最后, 递归函数必须包含能让递归调用停止的语句。 通常, 递归函数都使用if或其他等价的测试条件在函数形参等于某特定值时终止递归。

尾递归(tail recursion):最简单的递归形式是把递归调用置于函数的末尾, 即正好在 return 语句之前。 

例如计算阶乘:(0! 等于1, 负数没有阶乘)

long rfact(int n) // 使用递归的函数
{ 
long ans;
if (n > 0)
    ans = n * rfact(n - 1);
else
    ans = 1;
return ans;
}

递归的优点:

      递归为某些编程问题提供了最简单的解决方案。

递归的缺点:

     一些递归算法会快速消耗计算机的内存资源。 另外, 递归不方便阅读和维护。

 

在C语言中,递归函数是一种能够调用自身的函数,通常用于解决可分解为更小、更简单的同类问题的复杂问题[^1]。 使用递归函数时,关键在于确定两个部分:基准情况和递归情况。基准情况是递归的终止条件,避免无限递归;递归情况则是函数调用自身来解决规模更小的子问题[^1]。 以下是几个C语言递归函数的示例: ### 计算整数的阶乘 ```c #include <stdio.h> // 递归函数,计算阶乘 unsigned long long factorial(int n) { if (n == 0 || n == 1) { // 递归的基准情况 return 1; } else { // 递归调用 return n * factorial(n - 1); } } int main() { int num = 5; printf("Factorial of %d is %llu\n", num, factorial(num)); return 0; } ``` 此示例中,`factorial` 函数用于计算整数的阶乘。当 `n` 为 0 或 1 时,函数直接返回 1,这是基准情况;否则,函数通过调用自身计算 `n - 1` 的阶乘,再乘以 `n`,这是递归情况[^1]。 ### 计算组合数 ```c int jiecheng(int n) { if (n == 0) { return 1; } int cheng; cheng = jiecheng(n - 1) * n; return cheng; } int zuhe(int m, int n) { int q; int p; q = jiecheng(m); p = jiecheng(m - n) * jiecheng(n); return q / p; } ``` 这里 `jiecheng` 函数用于计算阶乘,`zuhe` 函数用于计算组合数。`jiecheng` 函数的基准情况是 `n` 为 0 时返回 1,递归情况是调用自身计算 `n - 1` 的阶乘再乘以 `n`。`zuhe` 函数调用 `jiecheng` 函数来计算组合数[^2]。 ### 计算字符串长度 ```c #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int my_strlen(char *str) { if (*str != '\0') { return 1 + my_strlen(str + 1); } else { return 0; } } int main() { char str[20] = "bit"; printf("%d\n", my_strlen(str)); return 0; } ``` `my_strlen` 函数用于计算字符串的长度。当字符串当前字符不为 `'\0'` 时,返回 1 加上后续字符串的长度(通过递归调用自身);当遇到 `'\0'` 时,返回 0,这是基准情况[^3]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值