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

Ruby 中递归的返回行为

左丘积厚
2023-03-14

我正在研究一个简单的递归方法,在Ruby中实现Euclid的算法,并发现自己在弄清楚一旦达到基本情况后如何返回所需的值。以下是我必须了解的内容:

def euclid_alg(larger,smaller)
  if larger % smaller == 0 && smaller != 1
    return smaller
  else
    puts 'calling self'
    euclid_alg(smaller, (larger % smaller))
    puts 'executed section after call'
  end
  puts "made it here #{smaller} #{larger}"
  nil
end
puts euclid_alg(100,15)

并且输出:

calling self
calling self
executed section after call
made it here 10 15
executed section after call
made it here 15 100

注意,“puts euclid_alg(100,15)”没有输出,我希望返回100和15,5的最大公约数。

为了进行故障排除,我将第3行中的返回较小的替换为放置较小的。新的产出是:

calling self
calling self
5
made it here 5 10
executed section after call
made it here 10 15
executed section after call
made it here 15 100

将“make it here 5 10”添加到控制台输出中,可以清楚地表明 return 语句是从函数调用中中断的,而不是“父调用”。

怎么做递归比较好?

共有1个答案

轩辕奕
2023-03-14

你的代码很好。你只是错过了回报。注:

def euclid_alg(larger,smaller)
  if larger % smaller == 0 && smaller != 1
    return smaller
  else
    puts 'calling self'
    return euclid_alg(smaller, (larger % smaller)) # <<<<<  Return here
    puts 'executed section after call'
  end
  puts "made it here #{smaller} #{larger}"
  nil
end
puts euclid_alg(100,15)
 类似资料:
  • 我不得不使用全局变量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方法,它可以递归地执行合并排序。我有这个方法,但这是一次我偶然得到它的工作,所以我不知道它为什么工作,并很想了解我写的代码是如何工作的。在psuedocode中,我遵循的步骤如下所示。 拆分长度为n的原始数组,直到我拥有长度为1的n个数组 一次合并和排序长度为m的2个数组,以返回长度为m*2的数组 重复上述步骤,直到我有一个长度为n的当前排序数组 基本上,在我看来,这是一

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