MATLAB初学者递归函数

时间:2014-07-30 23:27:47

标签: matlab recursion

使用matlab函数的语法有点困难;

function f = fact(x)
    if x == 1
        return
    else
        f = 1 - x*(fact(x-1))
    end
end

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

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

Error in recursion (line 6)
    f = 1 - x*(fact(x-1))

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

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

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

谢谢!

1 个答案:

答案 0 :(得分: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));

......看起来很熟悉?

因此确保您的文件名和功能名称相同。实际上,在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

当我这样做时,x = 10

时会得到以下输出
>> f = fact(10);

f =

 1334961

现在运行此代码时,我不会收到错误消息。另外,检查工作区中是否有名为fact的变量。当发生这种情况时,事实上你对一个变量的函数 shadowing ,所以它实际上是试图访问名为fact的变量。因此,请执行clear all;尝试清除工作区,然后再次尝试此代码。


一个警告

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

回答您的可选问题

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