如何用c语言编写递归程序?

时间:2016-06-30 05:20:07

标签: c recursion

我想编写一个C程序来读取任何五个int输入,如A B C D E

和输出

A-B, A-C, A-D, A-E

B-C, B-D, B-E

C-D, C-E

D-E

-是使用减号运算符,尽可能使用短代码。

所以我不想做循环迭代。

int i,j,a[5]={'\0'};
scanf("%d%d%d%d%d",&a[0],&a[1],&a[2],&a[3],&a[4]);

for(int i=0;i<4;i++)
    for(int j=i+1;j<5;j++)
        printf("%d\n",a[i]-a[j]);

4 个答案:

答案 0 :(得分:0)

尝试这个逻辑:

#include <stdio.h>

int func(int *a, int i, int j)
{
    if (j == 4)
        return 0;
    int tmp = 0;
    while(j != i)
    {
        int tmp2 = 0;
        tmp2 = a[j]-a[tmp+j+1];
        printf("%d\n", tmp2);
        i--;
        tmp++;
    }
    printf("\n");   
    func(a, 4, j+1);
}

int main()
{
    int arr[5]={'\0'};
    int i;
    int j = 0;
    for(i=0; i<5;i++)
    {
        scanf("%d",&arr[i]);
    }

    func(arr, i-1, j);
}

我试图避免使用循环,使用递归完成相同的程序。

下面还列出了程序的输出,

Input: Enter 5 number 1 2 3 4 5

Output : -1 -2 -3 -4    -1 -2 -3    -1 -2    -1

答案 1 :(得分:0)

仅用于递归,你可以这样做

#include<stdio.h>
int Recursion1(int *a1, int i, int j)
{
    if(j <= 4)
    {
        printf("%d\n", a1[i] - a1[j]);
        Recursion1( a1, i, j+1);
    }
    return 0;   
}
int Recursion(int *a1, int i, int j)
{

    if ( i <= 3 && j <= 4) 
    {
        Recursion1(a1, i, j);
        Recursion(a1, i + 1, j + 1);
    }
    return 0;
}

int main()
{
    int a[5];

    printf("Enter five integer Value = ");
    scanf("%d %d %d %d %d", &a[0], &a[1], &a[2], &a[3], &a[4]);
    printf("Output is:\n");
    Recursion(a, 0, 1);
}

代码的输出是:

Enter five integer Value = 1
2
3
4
5
Output is:
-1
-2
-3
-4
-1
-2
-3
-1
-2
-1

答案 2 :(得分:0)

尝试此逻辑:这会使用递归生成您想要的结果。

     #include<stdio.h>
     void recursion(int* array,int i,int j,int size)
     {
            if(i < size-1)
            {
                   if(j < size )
                   {
                        printf("%d\t",(array[i]-array[j]));
                        j++;
                        recursion(array,i,j,size);
                   }
                   else{
                         printf("\n");
                         i++;
                         j=i+1;
                         recursion(array,i,j,size);
                   }
            }
     }

    int main()
    {
       int i=0,j=i+1;
       int array[5]={2,3,4,7,8};
       recursion(array,i,j,5);
       return 0;
    }

输出:

-1  -2  -5  -6  
-1  -4  -5  
-3  -4  
-1

答案 3 :(得分:0)

要递归地解决这个问题,首先你必须从问题本身的角度考虑问题。

列表(数组)由 head tail 组成。

1 2 3 4 5
^ ^
H T

Head: 1, 2, 3, 4, 5
Tail: 2, 3, 4, 5

输出结果:

取出列表头部的第一个元素,并从中减去列表尾部的第一个元素。输出结果。

输出第一行:

然后,您可以获得如何输出结果的解决方案,您可以重复使用该结果输出行上的其他值。只需使用相同的头部再次调用例程,但尾部会沿着一个元素逐步调整。

1 2 3 4 5
^   ^
H   T

Head: 1, 2, 3, 4, 5
Tail: 3, 4, 5

递归,直到没有留下尾巴。然后输出换行符,因为我们知道该行已完成。

输出其他行:

重复使用解决方案来执行第一行,但是使用较短的列表可以通过将一个元素与头部一起进一步加载。

1 2 3 4 5
  ^ ^
  H T

Head: 2, 3, 4, 5
Tail: 3, 4, 5

...并且在我们不能再做之前做所有这些,因为列表不再有足够的尾部元素。

在代码中:

#include <stdio.h>

void doit(int *head, int headlen, int *tail, int taillen)
{
    if (taillen > 0) {
        printf("%d ", head[0] - tail[0]);
        doit(head, headlen, tail + 1, taillen - 1);
    }
    else {
        putchar('\n');

        if (headlen > 2) {
            doit(head + 1, headlen - 1, head + 2, headlen - 2);
        }
    }
}

int main(void)
{
    const int nelem = 10;
    int array[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

    doit(array, nelem, array + 1, nelem - 1);

    return 0;
}

运行它:

$ ./a.out
-1 -2 -3 -4 -5 -6 -7 -8 -9
-1 -2 -3 -4 -5 -6 -7 -8
-1 -2 -3 -4 -5 -6 -7
-1 -2 -3 -4 -5 -6
-1 -2 -3 -4 -5
-1 -2 -3 -4
-1 -2 -3
-1 -2
-1