【问题标题】:Creating a recursive algorithm创建递归算法
【发布时间】:2013-01-23 18:55:51
【问题描述】:

我一直在看目前关于 Coding Bat 的问题:

“我们有一个由块组成的三角形。最上面一行有 1 个块,下一行有 2 个块,下一行有 3 个块,依此类推。递归(无循环或乘法)计算块的总数在这样一个具有给定行数的三角形中。”

我了解问题的要求,也了解递归的工作原理。例如,如果给我一个递归函数,我可以手动计算它并显示输出将是什么。

问题实际上是根据给定问题创建递归函数,例如这个问题。我不确定如何实际设置并递归执行。在实际设置递归问题时是否需要遵循某种规则?我只能找到向您展示递归如何工作的示例,而不是向您展示如何实际解决递归问题。任何理解如何准备编写实际递归算法的帮助将不胜感激。

【问题讨论】:

  • 尝试计算如果为行设置一些值(不同于 0 或 1)会发生什么。如果您将这样的代码用于堆栈空间极其有限的系统,会出现什么情况会很有趣。
  • 阅读 The Little Schemer 的前 1/2。它有自然递归的分步示例和规则。

标签: java algorithm recursion geometry


【解决方案1】:

大概:

  1. 总是看问题,试着找出是否可以分割 同类型的子问题。这是第一个提示,你可以 可能使用递归。本质上,您正在寻找更小的 实际问题的实例/版本。

    因此,递归采用自上而下的方法(从更复杂到更简单的问题案例)。

  2. 当你能找到这样的案例时,你应该找出什么是 “大”案和“小”案与你之间的关系 有你的递归步骤

  3. 最后是找出终止条件或者什么 是您要停止的最小或最后一种情况。

您可能知道这一点,但如果不知道,它可能会对您有所帮助。

【讨论】:

  • 这就是我一直在寻找的答案。谢谢!
【解决方案2】:

对于recursion 算法,

首先设计base 的情况,函数应该开始展开堆栈或返回基值。

然后为每个non-base 案例设计要实际完成的算法

【讨论】:

  • 明白。在实际设计算法本身时,特别是在递归的思考过程中,是否有一个好的标准或一组步骤可以遵循?
  • 如果您对使用递归如此陌生,请在此处查看我的答案。它与任何预定义的计划无关。它只是思考过程。 stackoverflow.com/questions/14355629/…
【解决方案3】:

if(rows == 1) return 1;在这里没用。

对于递归全局问题,你必须反汇编你的问题,发现:

  1. 退出规则(可以是示例中的初始值,也可以是其中一个输入的退出条件)
  2. 一个步进过程(你必须对上一个输入做什么才能获得下一个输入)

并将它们组装在一个调用自身的函数中。

【讨论】:

  • 我只是要删除代码,以便了解我的实际问题。不过谢谢。
【解决方案4】:

试试这个代码:

#include <iostream>
using namespace std;
int sumf(int row,int sum){
if(row==0)     //basecase which ends the recursion.
return sum;
else
{sum=row+sum;
return sumf(--row,sum);   // repeating the process.
}}
int main() {
    cout<<"sum is: "<<sumf(5,0)<<endl;
system("pause");
    return 0;
    }

这是让你了解递归的视频。(忘记语言,只关注概念。)

http://www.youtube.com/watch?v=sNJQrtGD1Nc

【讨论】:

  • 我没有投反对票,但您没有回答 OP 的问题。他正在寻求有关创建递归算法的过程的实用建议,而不是另一个例子。如果他愿意,我相信他可以检查编码棒上的最终解决方案。
  • 你不懂。 “他说如果他给出了一个函数,他可以解决它”这意味着他不需要具体的解决方案,当他有解决方案时他可以解决它,但它或多或少没用.他想知道获得该解决方案的一般方法和技巧。
  • 是的,我意识到 SO 是针对更具体的编码问题,但我在这里发布的原因是因为我通常会得到一些非常可靠的答案。我放三角形示例的唯一原因是让我的问题看起来更具体。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-14
  • 1970-01-01
  • 1970-01-01
  • 2022-12-16
  • 2011-06-14
  • 2015-04-23
相关资源
最近更新 更多