C语言, 函数调用自身的问题( 要详细解析 )
#include <stdio.h>int f(int x)
{
if(x < 2)
return 1;
return x*f(x-1) + (x-1)*f(x-2);
}
void main()
{
int y;
y = f(4);
printf("%d\n", y);
}
本帖最后由 风过无痕1989 于 2020-9-21 22:42 编辑
脑海里 发表于 2020-9-21 21:28
麻烦说下原理呗
( 由于不经常在线, 微信( xx13521860832 ) )
#include <stdio.h> // 预处理,也即是调用C语言为编程人员准备的库函数,因为后面的 printf() 函数由 stdio.h 这个头函数定义的
int f(int x) // 定义 f 函数,x 就是 f 函数的形式参数(简称“形参”),此函数就是为了本程序的具体要求而设计的
{
if(x < 2) // 如果从主函数传过来的实参 x 值小于 2,执行下一条语句,向主程序返回,返回值为1,并将该返回值赋给 y
{
return 1;
}
else // 为了让你看得更清楚,此处我增加了一条 else 语句和花括号
{
return x*f(x-1) + (x-1)*f(x-2);// 如果从主函数传过来的 x 值大于等于 2,则跳过前一条语句,执行此条语句,表达式执行后,
// 若式中的 f() 函数括号里的实参仍然大于 2,则继续递归调用 f() 函数括号里的实参小于 2
// ( 注意:还是要执行上面那个花括号里的语句,多返回一个 1 的),返回主程序,并将该返回值赋给 y
}
}
void main() // 程序编译好以后,执行此行 main() 函数,这是主程序( main() 是程序的入口,所有程序都是从它开始的)
{
int y; // 定义整型变量 y
y = f(4); // 调用 f 函数,数字 4 是这个函数的初始实参,f 函数的返回值赋给 y,若返回值大于 2,继续调用 f 函数;若返回值小于 2 ,结束调用
printf("%d\n", y); // 以整型格式输出 f 函数最终的返回值(返回值先赋给变量 y)
}
递归调用 x*f(x-1) + (x-1)*f(x-2) 的过程在2楼已经详尽的列出了 此程序到是简单,复杂的就是第6行反复调用自己,直到 x < 2为止,下面就解释其调用过程:
x*f(x-1) + (x-1)*f(x-2)
=4*f(4-1)+(4-1)*f(4-2)
=4*f(3)+3*f(2)
=4*+3*
=4*+3*
=12*f(2)+8*1+9
=12*+17
=12*+17
=12*+17
=36+17
=53 本帖最后由 脑海里 于 2020-9-21 21:32 编辑
风过无痕1989 发表于 2020-9-20 22:54
此程序到是简单,复杂的就是第6行反复调用自己,直到 x < 2为止,下面就解释其调用过程:
x*f(x-1) + (x ...
麻烦说下原理呗
( 由于不经常在线, 微信( xx13521860832 ) ) 风过无痕1989 发表于 2020-9-20 22:54
此程序到是简单,复杂的就是第6行反复调用自己,直到 x < 2为止,下面就解释其调用过程:
x*f(x-1) + (x ...
从你回复的里面, 第四行, 我就迷糊了呀 本帖最后由 风过无痕1989 于 2020-9-21 22:27 编辑
脑海里 发表于 2020-9-21 21:50
从你回复的里面, 第四行, 我就迷糊了呀
因为第3行那里是:4 * f(3) + 3 * f(2)
而 f(x = 3) 和 f(x = 2) 它们的实参都是大于 2 的,所以,还得调用 f() 函数,所以,第4行就成了:
4 * [3 * f(3 - 1) + (3 - 1) * f(3 - 2)] + 3 * [2 * f(2 - 1) + (2 - 1) * f(2 - 2)]
红色部份就是上面5楼我改写的那个程序里的第11行的表达式,只是将具体的数字替代了表达式中的 x 而已
其他后面的式子,原理与此是相同的
页:
[1]