【问题标题】:Many call of function in Recursion递归中的许多函数调用
【发布时间】:2017-12-13 02:59:57
【问题描述】:

我正在使用递归实现 maxPathSum 函数,但我不知道在函数中使用两个调用时会发生什么。我知道那会被调用 二进制递归,并知道如何从这个问题的回复中思考它 Understanding double recursion

但是当我编写代码时它没有给我正确的答案 [注意] 唯一需要的方向是向右和向下

#include <iostream>
#include<algorithm>
using namespace std;
const int MAX=3;
int grid[MAX][MAX]={
                    {5,1,2},
                    {6,4,8},
                    {1,8,9}
};

bool valid(int r, int c);//check not get out grid
int maxPathSum(int r,int c);

int main()
{
    int sum=0;
    for(int i=0;i<MAX;i++)
    sum += maxPathSum(i,i);
    cout<<"the sum of the  longest path is: "<<sum;
}

int maxPathSum(int r,int c){
    if(!valid(r,c))
        return 1;

     //Reach the last element in the last right down
    if(r == MAX-1 && c == MAX-1)
        return grid[r][c];

    int path1=maxPathSum(r,c+1);//Right
    int path2=maxPathSum(r+1,c);//down

    return grid[r][c]+max(path1,path2);
}

 bool valid(int r, int c){
    if(r > MAX-1)
        return false;
    if(c > MAX-1)
        return false;

    return true;
}

当我在 main 中调用没有循环的函数时,有时它会给我正确的答案

像这样的矩阵长度很短

const int MAX=2;
int grid[MAX][MAX]={
                    {5,2},
                    {1,8}
};
maxPathSum(0,0);

【问题讨论】:

  • if(!valid(r,c)) return 1; 这种情况不应该是return 0吗?
  • 欢迎来到 StackOverflow。请阅读并遵循帮助文档中的发布指南。 Minimal, complete, verifiable example 适用于此。特别是,包括您的问题案例的实际和预期输出。

标签: c++ recursion


【解决方案1】:

你赚了双倍的钱。

return grid[r][c]+max(path1,path2)

这段代码已经对路径上的元素求和。

for(int i=0;i<MAX;i++)
sum += maxPathSum(i,i);

maxPathSum 将返回 (i,i) 和 (2,2) 之间路径上所有元素的总和。然后 sum 将包含对角元素上所有这些总和的总和。我不认为你想要那个。

在 main 中调用 maxPathSum(0,0) 应该会给出答案。

现在假设您调用 maxPathSum(1,2)。然后,此函数将调用 maxPathSum(2,2) 和 maxPathSum(1,3)。第一个将返回 e22,后者返回 1。如果 e22=0,结果将不正确。

我正在回答寻找 (0,0) 和 (max-1,max-1) 之间的最大路径的问题。如果问题不是这样定义的,你应该清楚地说明它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    • 2018-04-10
    • 2022-01-24
    • 2015-03-15
    • 1970-01-01
    相关资源
    最近更新 更多