代码之家  ›  专栏  ›  技术社区  ›  Matti Lyra

matlab递归错误(初学者)

  •  1
  • Matti Lyra  · 技术社区  · 15 年前

    好啊。所以我在matlab中有两个相互调用的函数。

    黎曼

    function I = Riemann(f, dx, a, b)
       x = a:dx:b;
       fx = f(x).*dx;
       I = sum(fx);
    

    和MyFunc m

    function f = myfunc(x)
       f = sin(1./x);
       for n=1:100
            I = Riemann(@myfunc, 0.001, 1/n, 1);
       end
       plot(I)
    

    问题是让它运行起来。我该怎么打电话给MyFunc才能从中得到什么呢?我尝试过的每一件事最终都会在一个无休止的递归调用堆栈中结束(这是有意义的)。

    3 回复  |  直到 15 年前
        1
  •  4
  •   PierreBdR    15 年前

    您的问题在于函数的定义:为了能够使用递归定义,您需要 必须 至少能够计算两个函数中的一个,而不需要另一个,至少对于某些值是这样。你 必须 还要确保每一个计算最终都依赖于这些不需要递归就能获得的结果。

    对于您的具体问题,我觉得您希望将函数f(x)=sin(1./x)整合起来。如果是这样,第二个函数的代码应该是:

    function f = myfunc(x)
       fct = @(x) sin(1./x);
       f = fct(x);
       for n=1:100
            I = Riemann(fct, 0.001, 1/n, 1);
       end
       plot(I)
    
        2
  •  0
  •   Muxecoid    15 年前

    函数myfunc不会在之后结束 f = sin(1./x); 它应该在哪里。在那里终止函数并从其他地方调用绘图代码(单独的文件)。

    手册: 可以使用END语句终止任何函数,但在大多数情况下,这是可选的。只有在使用一个或多个嵌套函数的m文件中才需要END语句。在这样的m文件中,每个函数(包括主函数、嵌套函数、私有函数和子函数)都必须用END语句终止。可以用end终止任何函数类型,但除非m-file包含嵌套函数,否则不需要这样做。

        3
  •  0
  •   AnnaR    15 年前

    当myfunc停止调用riemann时,您需要输入x的最后一个条件。另外,将实际函数(在本例中是sin)发送给riemann比调用myfunc更好。