【问题标题】:counting the number of iterations of a recursive function in C计算C中递归函数的迭代次数
【发布时间】:2021-07-24 16:49:18
【问题描述】:

我一直在尝试编写一个递归函数,它扫描一系列数字并返回奇数索引中的数字之和减去偶数索引中的数字之和。

最大的问题:函数在被调用时不应该接收任何参数;我必须在一个函数中完成。

编辑:所以,我编写了这段代码,它似乎在大多数情况下都可以工作,但问题是我不应该使用函数发送任何参数(f 不应该存在)

void Ex1()  // this is sort of like the main
{
    int f = 1, res;
    res = sumofodd_even(f);
    printf("sum is: %d\n", res-1);
}
int sumofodd_even(int flag)
{
    int num = 0;
    printf("enter a number. to stop enter -1 >> \n");
    scanf_s("%d", &num);
    if (num != -1)
    {
        if (flag == -1)
            num *= -1;
        return num + sumofodd_even((-1) * flag);
    }
}

顺便说一句:不能使用指针或数组...

将不胜感激。

【问题讨论】:

  • int sumofodd_even(int counter) { ... /*recurse*/sumofodd_even(counter + 1); ... }
  • 我迷路了。您想知道此函数中的迭代次数 次数,还是您选择不向我们显示的函数中的递归调用次数 次数?
  • 我正在尝试以递归方式编写与此类似的函数。我没有发布到目前为止我得到的东西,因为它并不多,只是尝试一下......

标签: c recursion


【解决方案1】:

一种方法可能是只使用在每次递归时翻转的布尔标志:

#include <stdbool.h>
#include <stdio.h>

int sumofodd_even(const bool odd) {
    printf("enter a number. to stop enter -1 >> ");
    
    int num = 0;
    scanf("%d", &num);
   
    if (num == -1) {
        return 0; // breaks the recursion
    }

    num *= odd ? 1 : -1;
    
    return num + sumofodd_even(!odd);
}

int main(void) {
    printf("sum is: %d\n", sumofodd_even(false)); // zero is even, thus we start with odd == false

    return 0;
}

您可以使用odd 标记读取的值是应视为odd 数字还是偶数,从而相应地更改其符号。

【讨论】:

  • 感谢您的回复!虽然问题是该函数在被调用时不应该接收任何参数。
  • 函数没有任何参数的有意义的原因为零,因为您可能总是有一个不同的int do_stuff(void),它只返回sumofodd_even(false)注意:C 与 C++ 不同,指定 T func() 实际上表示“任意数量的参数”而不是“无参数”,应该使用 T func(void)。跨度>
【解决方案2】:

计数迭代或翻转标志的替代方法是简单地使用两个函数。毕竟,您的算法有两种状态:处理偶数索引数,或处理奇数索引数。与其使用一个带有 if 语句的函数,不如为每个状态使用一个函数,并通过相互调用让这些函数在状态之间转换。

int sum_of_odd() {
    // <Ask user for input>
    if (num == -1) {
        return 0;
    }
    return sum_of_even() + num;
}

int sum_of_even() {
    // <Ask user for input>
    if (num == -1) {
        return 0;
    }
    return sum_of_odd() - num;
}

当然,您可以通过调用 sum_of_odd() 来启动算法,因为第一个数字是奇数索引(除非您想“按零索引”)。

【讨论】:

    猜你喜欢
    • 2015-05-18
    • 2021-09-15
    • 1970-01-01
    • 2021-04-15
    • 2023-01-17
    • 2020-09-23
    • 2022-06-28
    • 2019-06-20
    • 2014-06-08
    相关资源
    最近更新 更多