公告:本站正式转型为非交互式静态网站!
转型:本站将通过笔记和博客的形式继续为大家服务,关于 Mathematica 问答服务请移步至QQ群:365716997
联系:如有问题请联系QQ群管理员,或发送邮件至:lixuan.xyz@qq.com。
感谢:最后非常感谢大家多年来的支持与帮助!
参考《互联网跟帖评论服务管理规定》《中华人民共和国网络安全法》《网络信息内容生态治理规定》《互联网用户账号信息管理规定》

—— 2022-11-27

欢迎来到 Mathematica 问答社区

提问时请贴上文本代码

语法高亮:在编辑器中点击

被禁止的话题:广告破解

请阅读:《提问的智慧》

备用域名:mma.ooo

支持LaTex数学公式
行内公式标识符:\$ 或“$\backslash ($”+“$\backslash )$”,
行间公式标识符:\$\$ 或 “$\backslash [$”+“$\backslash ]$”

社区建议QQ群:365716997

分类

+2 投票
2.0k 浏览
r[g_, h_] = If[#1 == 0, g[##2], h[#0[#1 - 1, ##2], #1 - 1, ##2]] &



各位大大,能给我解释一下h到底是什么吗?

分类:函数 | 用户: jianbo (26 分)
修改于 用户:野鹤

3 个回答

+3 投票
 
已采纳
首先,应该先明白这几个概念:

#  表示提供给纯函数的第一个参数.

#n  表示第 n 个参数.

##n  纯函数中从 n 个变量开始的变量列.

##  纯函数中的所有变量列.

#0 表示整个纯函数.

If[#1 == 0, g[##2], h[#0[#1 - 1, ##2], #1 - 1, ##2]] &整个代表纯函数,其他的就不解释了,就解释#0[#1 - 1, ##2],,他就相当于If[#1 == 0, g[##2], h[#0[#1 - 1, ##2], #1 - 1, ##2]] &[#1 - 1, ##2],

再看下面一个例子(帮助文挡上的):

用 #0 对阶乘用递归定义:

f = If[#1 == 1, 1, #1 #0[#1 - 1]] &

结果是:f[10]=10*9*8......*2*1==10!==3628800

你再代入r[x, y][0],结果是:x[],带入r[x, y][0]结果是:y[x[], 0],(感觉你应该能明白了吧。。。。哈哈,反正我是提高不少!!)
用户: 挖掘机小王子 (451 分)
采纳于 用户:jianbo
我感觉脑子都看炸了。。可还是不明白啊!!怎么办,崩溃!哥哥能再给我讲明白一点吗??也就是用汉语描述一下它的具体过程啊,谢谢了
+1 投票

首先请仔细阅读帮助文档,了解下面符号的具体含意:

 &(*纯函数标记*)
 #(*用纯函数方式定义函数时,指参数列表中的第一个参数*)
 #2(*用纯函数方式定义函数时,指参数列表中的第2个参数*)
 #0(*用纯函数方式定义函数时,指纯函数本身*)
 ##2(*用纯函数方式定义函数时,指参数列表中从第2个参数开始以及之后的所有参数*)

如果都了解了,主要是#0,那么理解起来就很容易了。自己做个算例会更清楚比如:

r[a, b][5]

如果想看处理过程可以使用:

TracePrint[r[a, b][5]]

 

用户: 野鹤 (5.1k 分)
谢谢,我代入了1,逐步分析的结果的确能说明产生了一个递归调用。
+1 投票
确实,这个很费劲啊啊啊啊啊!!仔细看看这个例子:f = If[#1 == 1, 1, #1 #0[#1 - 1]] &,f[10],10是他的第一个参数,if判断不等于1,那就是10*#0[#1 - 1],#0 表示整个纯函数.也就是代表f,#1-1代表10-1==9,#0[#1 - 1]==f[10-1]==f[9],再次迭代,9作为第一个参数9不等于1,所以是10*9*f[9-1],一直这样下去,就是阶乘了!  (但愿讲明白了!!!)
用户: 挖掘机小王子 (451 分)
结果我明白了,现在就是对想出这个程序的人的无限崇拜了。。。
...