当前位置: 首页 > 知识库问答 >
问题:

无显式返回的递归TCL过程

谯嘉胜
2023-03-14

我正在编写一个简单的“proc”来计算阶乘。我想了解为什么我的函数没有返回语句就无法工作。

根据TCL文档,没有显式“return”定义的函数返回其主体中最后执行的命令的值。

    proc fac { n } {
       if { $n == 1 } {
         return 1
       } 
    puts $n
    set n [expr {$n - 1}]
    return [expr {[fac $n ] * $n}]                                                                                                                                                            
    }
    puts [fac 5] # ans 24

当“返回”被删除时,我收到以下错误消息

    invalid command name "1"
      while executing
     "[expr {[fac $n ] * $n}] "
        (procedure "fac" line 7)
        invoked from within

我希望如果没有显式的“return”,函数也应该返回24。

共有1个答案

东郭展
2023-03-14

你的期望是正确的。但是在最后一行中,在expr程序的周围有方括号。它是:

[expr {[fac $n] * $n}]

这对解释器来说意味着:1)使用给定参数执行expr过程;2)执行expr过程的结果。因此,解释器尝试执行不存在的过程1并且您收到错误。

要修复此错误,只需从最后一行中删除方括号:

proc fac { n } {
   if { $n == 1 } {
     return 1
   } 
   puts $n
   set n [expr {$n - 1}]
   expr {[fac $n ] * $n}                                                                                                                                                           
}
 类似资料:
  • 我不得不使用全局变量found来指示在哪里找到了一个和。返回语句始终未定义。 此外,如果在下面的if语句中使用return语句,代码将无法正常工作。 这不是问题的最佳解决方案,但这是我得到的工作版本。 返回语句之间的****,删除时代码工作,否则我要么得到false或未定义。我不明白这部分!为什么删除返回就能解决问题,我认为每个递归调用都必须用返回语句进行。 问题可能是由于多次呼叫造成的吗?我是不

  • 问题内容: 我有一个像这样的递归函数 我正在使用它 我注意到您好永远不会返回,因为我怀疑我在递归调用上创建了多个promise,但是我不确定如何从中返回。 如何返回每个递归创建的Promise? 编辑: 结果是 问题答案: 递归是一种功能性遗产,因此将其与功能性样式一起使用可产生最佳效果。这意味着编写接受和操作其输入(而不是依赖于外部状态)和返回值(而不是依赖于突变或副作用)的函数。 你的程序,而

  • 我正在创建一个递归导航迷宫的程序。代码: 然而,每当我到达死胡同时,它都不会回溯。当我调试时,它表明当程序从递归或“回溯”返回时,我的起始值专注于停留在我的死胡同空间。 例如: 9是我的出发点。2是我的退出。4是我的道路。1 表示墙壁。当我到达一个死胡同时(在本例中为第 7 行,第 2 列)。我的立场是等于整个程序其余部分的死胡同空间。这是为什么呢?

  • 我有以下递归javascript函数,它在Backbone.Marionette CollectionView的子级上循环,该子级具有依次为CollectionViews的ItemViews: 我是这样称呼它的: var view=DocumentManager.Documents.TreeRoot.FindViewByCID(model.cid); 问题是这一行: 如果我有这样的等级 然后te

  • 我正在研究一个简单的递归方法,在Ruby中实现Euclid的算法,并发现自己在弄清楚一旦达到基本情况后如何返回所需的值。以下是我必须了解的内容: 并且输出: 注意,“puts euclid_alg(100,15)”没有输出,我希望返回100和15,5的最大公约数。 为了进行故障排除,我将第3行中的替换为。新的产出是: 将“make it here 5 10”添加到控制台输出中,可以清楚地表明 re

  • 我有一个递归函数,它会重复这个函数,直到不满足if条件,然后输出一个整数。但是,此函数之外需要整数的函数正在接收一个单位。我应该如何修改代码以返回int? 这就是整个程序 }