我有一个关于C语言递归函数的问题

问题描述 投票:0回答:1

我英语不好,但我想问你一个问题。 在第一行中,您得到卡片的数量和 n 你得到第二行的卡片数量 这时,我正在写一段代码,求三个牌号之和尽可能接近n,就像黑杰克一样。我将其实现为递归函数,我决定全部完成,当我运行它时,总和会正常输出,但问题是总和会一遍又一遍地输出。所以我调试的时候就写了return 0;第14行,正常求和并输出,但并没有结束,递归函数不断重复。我想听听你的消息,因为我缺乏有关堆栈和内存的知识,而且我不知道 return; 之间的区别;并返回 0;。如果您能详细且友善地告诉我,我将不胜感激。

#include <stdio.h>
#include <stdlib.h>

int cards[100] = {0}, k = 0, value = 0, min = 100001, black_jack = 0;

int BlackJack(int first, int second, int third, int n, int m){
    for(int i  = third; i <= n - 1; i++){
        value = (cards[first] + cards[second] + cards[i]);
        if((m - value) < min && (m - value) >= 0){
            min = m - value;
            black_jack = value;
        }
    }
    if(first == n - 3){
        printf("%d", black_jack);
        return 0;
    }
    if(third == n - 1){
        k++;
        third = 2 + k;
        second = 1 + k;
        first += 1;
        BlackJack(first, second, third, n, m);
    }
    BlackJack(first, second + 1, third + 1, n, m);
}

int main(){
    int first = 0, second = 1, third = 2, n = 0, m = 0;
    scanf("%d %d", &n, &m);
    for(int i = 0; i < n; i++){
        scanf("%d", &cards[i]);
    }
    BlackJack(first, second, third, n, m);
}
c recursion return stack
1个回答
0
投票

(引用)“递归函数不断重复”的原因似乎在这里缺少返回语句:

    BlackJack(first, second, third, n, m);
}
BlackJack(first, second + 1, third + 1, n, m);

当/如果

BlackJack
的第一个调用返回时,执行将继续并再次调用
BlackJack
(即上面几行中的第二个调用)。这很可能不是您想要的。相反尝试:

    return BlackJack(first, second, third, n, m);
}
return BlackJack(first, second + 1, third + 1, n, m);

顺便说一句...

很难理解到达应该终止递归的代码的逻辑,即

if(first == n - 3){
    printf("%d", black_jack);
    return 0;   <------ Stop recursion
}

这要求

first
具有特定值。进一步查看您的代码,我们可以看到,仅当
first
具有特定值时,
third
才会更改。
third
的值在两个地方发生变化。在一个地方,这是一个简单的增量。在其他地方,这取决于
k
。那么
k
什么时候会改变……好吧,我迷路了。逻辑太复杂了。尝试找到一些逻辑,让您清楚地知道您实际上将到达终止递归的
return
语句。

© www.soinside.com 2019 - 2024. All rights reserved.