1

我一直在关注 Coding Bat 的当前问题:

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

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

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

4

4 回答 4

4

大致:

  1. 始终查看问题并尝试找出是否可以将其划分为相同类型的子问题。这是您可以使用递归的第一个提示。本质上,您正在寻找实际问题的较小实例/版本。

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

  2. 当你能找到这样的情况时,你应该找出“更大”情况和“更小”情况之间的关系,然后你就有了递归步骤

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

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

于 2013-01-23T19:16:11.950 回答
2

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

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

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

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

于 2013-01-23T19:00:32.080 回答
2

对于一个recursion算法,

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

non-base然后为每种情况设计要实际完成的算法

于 2013-01-23T19:01:11.110 回答
0

试试这个代码:

#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

于 2013-01-23T19:07:20.890 回答