C递归返回2个值

时间:2016-11-13 20:37:31

标签: c pointers recursion

我试图使用递归返回2个数字的数字总和。我认为我的算法没问题,但是我的指针并不是很好,当他们指向main中声明的变量时,我不明白他们为什么会显示奇怪的值(比如当声明变量时)它们是0

这是我的代码:

int get_sums(int **fp, int **sp, int n1, int n2) {
    printf("fp: %d\n", fp);
    printf("sp: %d\n", sp);
    printf("n1: %d\n", n1);
    printf("n2: %d\n", n2);

    if (n1 == 0) {
        return 0;
    }

    *fp += (n1 % 10);
    *sp += (n2 % 10);

    return get_sums(&fp, &sp, n1 / 10, n2 / 10);
}

int main(void) {
    int f = 0, s = 0;
    int *fp = &f;
    int *sp = &s;
    int first = 123, second = 456;

    get_sums(&fp, &sp, first, second);
    printf("First sum: %d\nSecond sum: %d\n", *fp, *sp);
    return 0;
}

2 个答案:

答案 0 :(得分:2)

您有多个问题:

  • 你正在使用2级间接,其中一个就足够了

  • 您没有取消引用将值传递给printf的指针

  • 你应该递归地传递指针而不是它们的地址,但是用结果的地址调用函数。

  • 你应该递归,直到两个数字完全被摧毁

  • 您应该为编译器启用更多警告,以帮助您避免此类错误:例如gcc -Wall

以下是更正后的版本:

#include <stdio.h>

void get_sums(int *fp, int *sp, int n1, int n2) {
    printf("fp: %d\n", *fp);
    printf("sp: %d\n", *sp);
    printf("n1: %d\n", n1);
    printf("n2: %d\n", n2);

    if (n1 == 0 && n2 == 0) {
        return;
    }

    *fp += n1 % 10;
    *sp += n2 % 10;

    get_sums(fp, sp, n1 / 10, n2 / 10);
}

int main(void) {
    int f = 0, s = 0;
    int first = 123, second = 456;

    get_sums(&f, &s, first, second);
    printf("First sum: %d\nSecond sum: %d\n", f, s);
    return 0;
}

答案 1 :(得分:1)

你不需要通过指针传递指针。:)

考虑到该功能将始终返回0.

它可以看作以下方式

#include <stdio.h>

void get_sums( int *fp, int *sp, int n1, int n2) 
{
    printf("fp: %d\n", *fp);
    printf("sp: %d\n", *sp);
    printf("n1: %d\n", n1);
    printf("n2: %d\n", n2);

    if ( n1 != 0 && n2 != 0 )
    {
        *fp += (n1 % 10);
        *sp += (n2 % 10);

        get_sums( fp,  sp, n1 / 10, n2 / 10);
    }
}   

int main(void) 
{
    int f = 0, s = 0;   
    int *fp = &f;
    int *sp = &s;

    int first = 123, second = 456;

    get_sums( fp, sp, first, second);
    printf("First sum: %d\nSecond sum: %d\n", *fp, *sp);
    return 0;
}

程序输出

fp: 0
sp: 0
n1: 123
n2: 456
fp: 3
sp: 6
n1: 12
n2: 45
fp: 5
sp: 11
n1: 1
n2: 4
fp: 6
sp: 15
n1: 0
n2: 0
First sum: 6
Second sum: 15