鱼C论坛

 找回密码
 立即注册
查看: 1725|回复: 5

[已解决]C语言, 函数调用自身的问题( 要详细解析 )

[复制链接]
发表于 2020-9-20 21:31:11 | 显示全部楼层 |阅读模式
20鱼币
#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);
}


最佳答案
2020-9-20 21:31:12
本帖最后由 风过无痕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楼已经详尽的列出了

最佳答案

查看完整内容

递归调用 x*f(x-1) + (x-1)*f(x-2) 的过程在2楼已经详尽的列出了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-20 21:31:12 | 显示全部楼层    本楼为最佳答案   
本帖最后由 风过无痕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楼已经详尽的列出了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-20 22:54:30 | 显示全部楼层
此程序到是简单,复杂的就是第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*f(3-1)+(3-1)*f(3-2)]+3*[2*f(2-1)+(2-1)*f(2-2)]
=4*[3*f(2)+2*F(1)]+3*[2*f(1)+f(0)]
=12*f(2)+8*1+9
=12*[2*f(2-1)+(2-1)*f(2-2)]+17
=12*[2*f(1)+f(0)]+17
=12*[2+1]+17
=36+17
=53
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-9-21 21:28:34 | 显示全部楼层
本帖最后由 脑海里 于 2020-9-21 21:32 编辑
风过无痕1989 发表于 2020-9-20 22:54
此程序到是简单,复杂的就是第6行反复调用自己,直到 x < 2为止,下面就解释其调用过程:

x*f(x-1) + (x ...


麻烦说下原理呗
( 由于不经常在线, 微信( xx13521860832 ) )
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-9-21 21:50:24 | 显示全部楼层
风过无痕1989 发表于 2020-9-20 22:54
此程序到是简单,复杂的就是第6行反复调用自己,直到 x < 2为止,下面就解释其调用过程:

x*f(x-1) + (x ...

从你回复的里面, 第四行, 我就迷糊了呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-21 22:22:04 | 显示全部楼层
本帖最后由 风过无痕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 而已

其他后面的式子,原理与此是相同的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 02:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表