使用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
声明是否必要?
谢谢!
答案 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
声明并不是必需的,但无论如何它都是好的做法。但是,如果在函数文件中定义了多个函数,那么肯定需要正确表示该函数的结尾是在那里定义的。但是,如果您只为每个文件编写一个函数,则不需要它,但我建议将其保留在那里,因为它是一种很好的做法。