首页 > 解决方案 > 当 k 为 0 时,函数 fact_of_k 返回分段错误

问题描述

我想知道为什么这个程序给我一个分段错误。请注意,我通过将变量 k 的值从 0 更改为 1 解决了这个问题。虽然它解决了我的问题,但我想知道当 k 为 0 时逻辑/系统会发生什么?

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

int fact_of_nk(int);
int fact_of_k(int);
int fact_of_n(int);

int main()
{
    int fact_n, fact_k, fact_nk, bmu, k = 0, nk;

    for (int n = 1; n <= 10; n++)
    {
        fact_n = fact_of_n(n);
    
        while (k <= n)
        {
            fact_k = fact_of_k(k);
            int nk = (n - k);
            printf("%d ", nk);
            k++;
        }
        k = 0;
        printf("\n");
    }
    
    return 0;
}


    int fact_of_n (int number)
{
    if (number == 1)
        return 1;
    else
        return number * fact_of_n(number - 1);
}

    int fact_of_k (int choose)
{
    if (choose == 1)
        return 1;
    else
        return choose * fact_of_k(choose -1);
}

    int fact_of_nk (int choose)
{
    if (choose == 1)
        return 1;
    else
        return choose * fact_of_nk(choose - 1);
}

标签: c

解决方案


由于递归,您的代码会出现分段错误。看看你的程序中发生了什么。你k传给fact_of_k. k为 0,并且0 != 1。所以它fact_of_k再次调用,这次是0 - 1,所以 -1。-1 不是一,所以它fact_of_k再次调用,这次传递了 -2。你可以看到问题。过多地使用递归会导致分段错误,这就是您的程序无法运行的原因。


推荐阅读