具有递归因子实现的分段错误

时间:2018-05-07 05:31:47

标签: c

现在我在Linux上练习使用Vim。 我做了一个像这样的简单代码

#include <stdio.h>

int factorial(int n){
   if (n<0) { return 0; }
   else if (n==0) { return 1; }
   else { return n * factorial(n); }
}

int main(void){
   int n = 0;

   printf("Put n value : ");
   scanf("%d", &n);  /* non-OP inserted ";" to help people focus on the problem */

   printf("%d! = %d\n", n, factorial(n));

   return 0;
}

当我输入-1和0时,它有效。他们返回0和1。 但是,当我在n上放置正整数值时,它不起作用。 我试图找出原因,所以我使用了gdb,
但它只是这样说:

  

编程接收信号SIGSEGV,分段故障   factorial()

中的0x0000000000400620

我的代码出了什么问题?我甚至无法理解这一点。

2 个答案:

答案 0 :(得分:4)

n您的递归程序永远不会终止时。 return n * factorial(n-1);的值永远不会递减,因此它会继续以递归方式运行,直到内存耗尽为止。

应为SELECT *

答案 1 :(得分:3)

您的代码导致堆栈溢出。在给定的函数中,else { return n * factorial(n-1); } 永远不会递减。最后的陈述应该是

import { ApolloClient } from 'apollo-client'
import { ApolloLink } from 'apollo-link'
import { InMemoryCache } from 'apollo-cache-inmemory'
import { HttpLink } from 'apollo-link-http'
import { withClientState } from 'apollo-link-state'

const cache = new InMemoryCache()
const stateLink = withClientState({
  cache,
  resolvers,
  defaults,
})
const client = new ApolloClient({
  cache,
  link: ApolloLink.from([stateLink, new HttpLink()]),
})