C-接受指针作为参数问题的递归函数

时间:2018-12-21 15:38:32

标签: c function recursion

我遇到了一个问题,我必须编写一个接受两个参数的函数(两个都是指针,第一个指向数组的开头,第二个指向最后一个数组之后的内存位置)数组的元素)

必须从数组的第一个元素到中间的一个元素,然后从中间元素到最后的一个元素,调用函数,然后该函数应返回这两个较大的值

double max_element(double *p1, double *p2)
{
    double from_first_to_middle = max_element(p1, (p1 + p2) / 2 + p1);

    double from_middle_to_last = max_element((p1 + p2) / 2 + p1, p2);

    if(from_first_to_middle > from_middle_to_last)
    {
        return from_first_to_middle;
    }
    else
    {
        return from_middle_to_last;
    }
}

但是当我尝试运行此代码时,它给了我错误

error: invalid operands to binary + (have ‘double *’ and ‘double *’)

因此,我以为我应该取消引用这些指针,因为我无法使用它们指向的地址进行这些操作,但仍然无法正常工作。

有人可以帮忙吗?

谢谢!

4 个答案:

答案 0 :(得分:3)

指针不是整数。仅为它们定义了一些算术运算,并且指针+指针加法和指针/整数除法不在其中(它们是什么意思?)。您可以将一个整数添加到一个指针以获取另一个指针,该指针与原始指针偏移指定数量的目标对象。相反,您可以从另一个指针中减去一个指针以获得一个整数,该整数表示两个指向的目标对象之间的数量。这两个操作都有限制,但这些限制不应干扰您需要执行的操作。

您可以将上述类型的指针算术运算与某些整数(仅)算术一起使用,以计算函数所需的中点指针。细节留作练习。

答案 1 :(得分:0)

也许这会有所帮助。

double max_element(double *p1, double *p2)
{
    double from_first_to_middle = max_element(p1, (double *)((size_t)(p2 - p1) / 2) + p1);

    double from_middle_to_last = max_element((double *)((size_t)(p2 - p1) / 2 + 1) + p1, p2);

    if (from_first_to_middle > from_middle_to_last)
    {
        return from_first_to_middle;
    }
    else
    {
        return from_middle_to_last;
    }
 }

答案 2 :(得分:0)

我认为您的代码不会结束,因为您的返回有一些问题。 如果p1 + 1 == p2,则递归继续递归。您应该添加一行

if ((p1+1) == p2)
 return *p1;

开头。

double max_element(double* p1, double* p2){
    if ((p2 - p1) <= 0)
        exit(1);
    if ((p1+1)==p2)
        return *p1;
}

答案 3 :(得分:0)

如果不是使用p1p2变量名,而是使用与变量名from_first_to_middlefrom_middle_to_last匹配的指针,则情况可能会变得更加清楚:

double max_element(double *first, double *last)
{
    if (last - first == 1)
    {
        return *first; // base case of our recursion
    }

    double *middle = first + (last - first) / 2;

    double from_first_to_middle = max_element(first, middle);

    double from_middle_to_last = max_element(middle, last);

    if (from_first_to_middle > from_middle_to_last)
    {
        return from_first_to_middle;
    }

    return from_middle_to_last;
}

尽管(p1 + p2) / 2与常规数字相同,但p1 + (p2 - p1) / 2(p1 + p2) / 2 + p1相同,但由于缺少指针加法,该逻辑不适用于指针。即使那样,您的公式:@client.event async def on_message(message): if message.content.startswith('pclear'): tmp = await client.send_message(message.channel, '**Purging messages...**') async for msg in client.logs_from(message.channel): await client.delete_message(message) 对于常规数字也是错误的。