只是对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
陈述是否必要?
谢谢!
最明显的错误是你的函数文件名.您有一个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
说法不是必需的,但无论如何这都是好的做法.但是,如果在函数文件中定义了多个函数,那么肯定需要正确表示该函数的结尾是在那里定义的.但是,如果您只为每个文件编写一个函数,则不需要它,但我建议将其保留在那里,因为这是一个好习惯.