【问题标题】:Showing simulation of the recursion, given the recursion algorithm给出递归算法,显示递归的模拟
【发布时间】:2021-01-12 04:57:21
【问题描述】:

C 中的以下程序将 n 作为输入,并使用递归找到序列的总和直到第 n 项。该系列如下: (1 x 3) + (2 x 5) + (4 x 7) + (8 x 9) + ... + 第 n 项

这是我的代码:

#include <stdio.h>
#include <math.h>
int addNumbers(int n);
int main(){
    int n;
    printf("Enter a positive integer n: ");
    scanf("%d", &n);
    printf("Sum = %d", addNumbers(n));
    return 0;
}

int addNumbers(int n){
    if (n>0)
        return pow (2, n-1)*(2*n+1)+addNumbers(n-1);
    else
        return n;
}

如何在我的代码中显示 n=5 的递归模拟?

【问题讨论】:

  • 以什么方式显示?也许只是在函数中添加printf() 调用?
  • 您需要将函数重写为更详细,例如a=pow(); b=2*n+1; c=addNumbers(); result=a*b+c; 然后你可以打印任何你想要的,然后返回结果。

标签: c recursion


【解决方案1】:

在返回pow(2, n-1)*(2*n+1)+addNumbers(n-1) 操作之前,您可以打印以获取模拟。由于这里使用递归自顶向下过程,因此您的模拟也会影响自顶向下方法。

#include <stdio.h>
#include <math.h>
int addNumbers(int n)
{
    if (n>0){
        int a=pow(2,n-1);
        int b=2*n+1;
        if(n>1)
            printf("(%d x %d) + ",a,b);
        else
            printf("(%d x %d)\n",a,b);
        return pow(2, n-1)*(2*n+1)+addNumbers(n-1);

    }
    else
        return n;
}
int main()
{
    int n;
    printf("Enter a positive integer n: ");
    scanf("%d", &n);
    printf("Sum = %d", addNumbers(n));
    return 0;
}

输出

Enter a positive integer n: 5
(16 x 11) + (8 x 9) + (4 x 7) + (2 x 5) + (1 x 3)
Sum = 289

如果您想获得自下而上的方法模拟,请按照此操作。

int sum=0,tmp;
int addNumbers(int n)
{
    if (n>0){
        sum+=pow(2, n-1)*(2*n+1)+addNumbers(n-1);
        int a=pow(2,n-1);
        int b=2*n+1;
        if(tmp==n)
            printf("(%d x %d)\n",a,b);
        else
            printf("(%d x %d)+ ",a,b);
    }
    return sum;
}
int main()
{
    int n;
    printf("Enter a positive integer n: ");
    scanf("%d", &n);
    tmp=n;
    printf("Sum = %d\n", addNumbers(n));
    return 0;
}

输出

Enter a positive integer n: 5
(1 x 3)+ (2 x 5)+ (4 x 7)+ (8 x 9)+ (16 x 11)
Sum = 289

【讨论】:

  • 您的自下而上的方法模拟,当我输入 n=5 时,没有给出 289 作为输出
  • 两个代码都给了我相同的结果 289。你能再检查一下吗?而代码逻辑也一样
【解决方案2】:

跟踪递归的最简单方法是插入一些printf 语句。

int addNumbers(int n){
    if (n > 0)
    {
        int term = pow(2, n - 1) * (2 * n + 1);  // = (1 << (n - 1)) * (2 * n + 1) 
        int sum = term + addNumbers(n - 1);
        printf("+ %d = %d\n", term, sum);        // +++
        return sum;
    }
    else
    {
        printf("= %d\n", n);                     // +++
        return n;
    }
}

输出n = 5:

= 0
+ 3 = 3
+ 10 = 13
+ 28 = 41
+ 72 = 113
+ 176 = 289

Sum = 289

您还可以通过使用计算幂的递归变体来摆脱 pow 调用(危险、昂贵并且不必要地使用浮点)。

int addMulNumbers(int n, int *p){
    if (n > 0)
    {
        int mul = addMulNumbers(n - 1, p);
        int term = *p * (2 * n + 1); 
        int sum = term + mul;
        printf("+ %d = %d\n", term, sum);        // +++
        *p *= 2;
        return sum;
    }
    else
    {
        printf("= %d\n", n);                     // +++
        return n;
    }
}

int addNumbers(int n){
    int p = 1;
    return addMulNumbers(n, &p); 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-12
    • 2013-02-14
    • 1970-01-01
    • 2016-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多