MATLAB初学者递归函数

seb*_*jun 1 recursion matlab

只是对matlab函数的语法有点困难;

function f = fact(x)
    if x == 1
        return
    else
        f = 1 - x*(fact(x-1))
    end
end
Run Code Online (Sandbox Code Playgroud)

在命令窗口中使用参数10调用此函数时,我收到错误

Undefined function 'fact' for input arguments of type 'double'.

Error in recursion (line 6)
    f = 1 - x*(fact(x-1))
Run Code Online (Sandbox Code Playgroud)

我已经浏览了第一个解决方案,第一个解决方案围绕m文件的路径,这似乎不是一个问题,因为同一目录中的其他文件运行良好,

第二个我不知道为什么第6行出现错误,我的猜测是它与变量和函数名称有关.

作为一个附带问题,这些end陈述是否必要?

谢谢!

ray*_*ica 7

最明显的错误是你的函数文件名.您有一个fact在代码中定义的函数,但您命名了您的文件recursion.确保两个你函数名文件名都都呼吁 fact.

如果您将文件命名为recursion,则将代码中定义的函数名称设为fact,如果您尝试调用代码,则会发生这种情况:

>> f = recursion(10);

Undefined function 'fact' for input arguments of type 'double'.

Error in recursion (line 6)
    f = 1 - x*(fact(x-1));
Run Code Online (Sandbox Code Playgroud)

... 看起来熟悉?

因此,请确保您的文件名和函数名称相同.实际上,在MATLAB编辑器中,它应该自动给出一个错误,说明这两个都不一样.


您的代码中还有另一个错误.基本案例未正确定义.永远记住,当你编写递归算法时,最终函数将返回......当你遇到基本情况时就是这样.我们可以在这看到它是什么时候x = 1.什么时候x = 1,你应该分配f输出的东西.您只是退出该函数,因此当它x变为1时,您的代码将吐出一个错误,表示f在函数完成时未分配.因此,您需要弄清楚您的基本情况.我将假设你的基本情况(何时x = 1)将是平等的0.你显然需要改变它,因为我不知道你的代码实际上是在计算什么.基本上,你需要这样做:

function f = fact(x)
    if x == 1
        f = 0; %// Base case needs to change according to your specs
    else
        f = 1 - x*(fact(x-1))
    end
end
Run Code Online (Sandbox Code Playgroud)

当我这样做时,我得到以下输出 x = 10

>> f = fact(10);

f =

 1334961
Run Code Online (Sandbox Code Playgroud)

我现在运行此代码时没有收到错误.另外,检查fact您的工作区中是否有任何变量.当发生这种情况时,实际上你正在使用变量遮蔽你的函数,所以它实际上是试图访问调用的变量fact.因此,尝试通过执行清除工作区clear all;,然后再次尝试此代码.


一个警告

如果要将x指定为0负数,则此函数将永不停止.因此,当发生这种情况时,您需要提供一些检查并执行适当的操作.此外,您需要确保指定接受的输入类型x.从上下文来看,x只是正整数.正如@Glen_b所指出的那样,如果你提供的任何数字都不是正整数,那么这个函数永远不会停止,因为x递归管道永远不会等于1.

回答您的可选问题

第一个end声明是结束声明所必需的if.第二种end说法不是必需的,但无论如何这都是好的做法.但是,如果在函数文件中定义了多个函数,那么肯定需要正确表示该函数的结尾是在那里定义的.但是,如果您只为每个文件编写一个函数,则不需要它,但我建议将其保留在那里,因为这是一个好习惯.