首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数的函数

函数的函数
EN

Stack Overflow用户
提问于 2011-04-05 06:37:37
回答 5查看 11.2K关注 0票数 8

比方说,我有一些f[a_,b_,c_]=a+b+c函数。现在我需要定义另一个函数g[f_,d_]=f+d,这里的f应该替换为f的定义,结果是a+b+c+d

我该怎么做呢?我试过g[f_,d_]=f+d/.f->Definition[f],但是不起作用。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-04-05 06:41:34

嗯,你的设置要求g是a,b和c的函数,因为你显式地使f成为它的函数。相反,可以这样做:

代码语言:javascript
复制
f[a_,b_,c_]=a+b+c;

g[f_,a_,b_,c_,d_] = f[a,b,c]+d

Out2= a+b+c+d

Daniel Lichtblau

票数 13
EN

Stack Overflow用户

发布于 2011-04-05 08:52:32

这只是个附注。

当两个函数共享相同的参数,或者第二个函数的参数在第一个函数中隐含时,整个事情就更有意义了。

例如:

代码语言:javascript
复制
f[x_] := 1 + 1/x;

g[h_, x_] := h[x]^x;

Limit[g[f, x], x -> +Infinity]  
-> E

或者类似于

代码语言:javascript
复制
f[x_] := EuclideanDistance[x, #] &

g[f_, x_] := If[f[2 x]@x < 3, x, 2 x]

g[f, 3]
->6

g[f,2]
->2
票数 3
EN

Stack Overflow用户

发布于 2011-04-05 07:33:48

Daniel's answer是正确的-它回答了您应该问的问题!

但为了好玩,这里有一些更接近你实际问题的东西。

代码语言:javascript
复制
f[a_,b_,c_] := a + b + c

g[f_, d_] := Catch[Module[{dv},
  Check[dv = DownValues[f], Throw[$Failed], {DownValues::sym}];
  Switch[Length[dv],
         0, Print["No DownValues"]; $Failed,
         1, dv[[1, 2]] + d,
         _?(# > 1 &), Print["More than one DownValue - using the first!"]; 
                      dv[[1, 2]] + d,
         _, Print["huh?!"]; $Failed]]]

测试它:

代码语言:javascript
复制
In[3]:= g[f, d]
Out[3]= a + b + c + d

定义另一个函数:

代码语言:javascript
复制
ff[a_, b_, c_] := a b c

In[5]:= g[ff, d]
Out[5]= a b c + d

然后再给它下一个定义:

代码语言:javascript
复制
In[6]:= ff[a_, b_] := a + b
In[7]:= DownValues[ff]
Out[7]= {HoldPattern[ff[a_,b_,c_]] :> a b c, HoldPattern[ff[a_,b_]] :> a+b}

In[8]:= g[ff, d]
During evaluation of In[8]:= More than one DownValue - using the first!
Out[8]= a b c + d

当然,在g[f_,d_]中不向f传递任何论据的事实(在大多数情况下)会使这类事情变得非常没有意义……

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5545113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档