首页 > 解决方案 > 递归函数无法按预期返回值

问题描述

我想使用递归来实现贝塞尔曲线,在recursive_bezier函数中它递归所有输入点,直到只剩下一个点并返回该点,然后在贝塞尔函数中通过执行recursive_bezier获取该值。但是在贝塞尔函数中我只能得到第一个输入点的值,为什么不理想呢?请帮忙。

#include <chrono>
#include <iostream>
#include <opencv2/opencv.hpp>

std::vector<cv::Point2f> control_points;

cv::Point2f recursive_bezier(const std::vector<cv::Point2f> &control_points, float t) 
{
    int control_size = control_points.size();
    std::vector<cv::Point2f> temp_points;
    if (control_size != 1)
    {
        
        for (int i = 0; i < control_size - 1; i++)
        {
            cv::Point2f t_point;
            auto vt = (control_points[i+1] - control_points[i])*t;
            t_point.x = control_points[i].x + vt.x;
            t_point.y = control_points[i].y + vt.y;
            temp_points.push_back(t_point);

        }
        recursive_bezier(temp_points, t);

    }
    std::cout << "from recursive" << control_points[0] << std::endl;  //here can output correct point value
    return control_points[0];
}

void bezier(const std::vector<cv::Point2f> &control_points) 
{

    for (double t = 0.0; t <= 1.0; t +=0.5)
    {
        cv::Point2f point = recursive_bezier(control_points, t);  
        std::cout << "from bezier:" << point << std::endl;  //here cannot get the point correct, it always printout the first value of the input control_points
    }

}

int main() 
{
    control_points.emplace_back(4,5);
    control_points.emplace_back(3.6);
    bezier(control_points);
    return 0;
}

标签: c++

解决方案


忽略细节,你的代码是这样的:

cv::Point2f recursive_bezier(const std::vector<cv::Point2f> &control_points, float t) 
{
    int control_size = control_points.size();
    std::vector<cv::Point2f> temp_points;
    if (control_size != 1)
    {
        recursive_bezier(temp_points, t);    
    }       
    return control_points[0];
}

因为函数通过 const 引用获取向量,所以调用recursive_bezier(temp_points,t)对函数最终返回的内容没有影响。唯一的回报是return control_points[0];,这就是函数总是返回的。

您忘记了实际使用递归调用的返回值。我想你只是想退货:

cv::Point2f recursive_bezier(const std::vector<cv::Point2f> &control_points, float t) 
{
    int control_size = control_points.size();
    std::vector<cv::Point2f> temp_points;
    if (control_size != 1)
    {
        return recursive_bezier(temp_points, t);     // <---
    }       
    return control_points[0];
}

推荐阅读