运行包含函数定义的八度脚本文件

Dav*_*ide 3 octave

我有一个非常新手的八度音阶问题。
在八度控制台中运行以下代码可以正常工作:

function fibo = recfibo(n)
  if ( n < 2 )
    fibo = n;
  else
    fibo = recfibo(n-1) + recfibo(n-2);
  endif
endfunction
disp(recfibo(5))
Run Code Online (Sandbox Code Playgroud)

通过将此代码插入名为例如file.m的外部文件中,并通过octave file.m错误执行它,将会发生:

警告:函数名称'recfibo'与函数文件名'/ Users / admin / Google Drive / file.m'不符错误:'n'在第2行第8列附近未定义错误:从八度在第2行第3列调用

我应该如何解决这个特殊问题?

Cri*_*ngo 7

添加1;为文件的第一行:

1;

function fibo = recfibo(n)
  if ( n < 2 )
    fibo = n;
  else
    fibo = recfibo(n-1) + recfibo(n-2);
  endif
endfunction

disp(recfibo(5))
Run Code Online (Sandbox Code Playgroud)

以函数定义开头的任何M文件都是函数M文件,而不是脚本M文件。通过在顶部添加无意义的语句,可以将其变成脚本。


在MATLAB中(自最近以来),脚本M文件可以在脚本末尾定义函数。在那里,您将该disp行放在文件的顶部,并将该function块放在末尾,之后没有任何脚本行。但是,八度需要在使用函数之前先定义它们,因此它必须位于使用该函数的脚本行之前。在MATLAB引入该功能之前,Octave允许在脚本文件中定义函数,因此它们的实现与MATLAB的实现不兼容。

  • 小提示:这不仅仅是语法差异。在Matlab中,脚本文件末尾的函数定义是本地函数,它们仅在该脚本文件内可见,并且定义发生在文件解析/编译时。在 Octave 中,脚本文件中的函数定义定义了新的全局函数,这些函数在任何地方都可见(并替换任何先前定义的同名全局函数),并且(重新)定义在运行时在您点击该“函数”时生效。 ..`线。可能导致细微的错误/行为差异。 (5认同)

rah*_*ma1 6

如@CrisLuengo提供的答案中所述,您已经创建了一个功能文件而不是脚本文件,并且differently在Octave中对其进行了处理。因为它是一个功能文件,Octave通过调用它定义的不带参数和的函数来执行它nargout = 0。因此,您将得到n未定义的错误。

另一个问题是函数名称'recfibo'与函数filename不一致'file'。在这种情况下,Octave在内部将函数的名称更改为函数文件的名称,因此名称更改为'file'。因此,Octave和函数本身将忘记原始函数名,但不幸的是,该函数无法递归调用自身!

我喜欢@CrisLuengo的答案,但我认为更惯用和更好的方法是始终使用功能文件而不是脚本文件,尽管脚本文件解决方案是在以前的Octave版本(Octave 3.X)中唯一的解决方案。

您可以将代码更改为:

function file
    disp(recfibo(5))
endfunction
function fibo = recfibo(n)
    if ( n < 2 )
        fibo = n;
    else
        fibo = recfibo(n-1) + recfibo(n-2);
    endif
endfunction
Run Code Online (Sandbox Code Playgroud)

  • 我同意最好总是编写函数。它使基础工作区保持清洁。 (2认同)