大规模递归函数中的分段错误

时间:2015-10-07 16:59:36

标签: c++ math

我有一个函数,它自称近乎无数次,但确实有一个结束。它计算数学公式(在TeX中):

x<a时:

g_{a}(x)=1

x>=a时:

g_{a}(x)=g_{a}(x-1)+g_a(x-a)

这是我的代码(c ++):

#include <iostream>
#include <math.h>
#include <stdio.h>
#include <cmath>
using namespace std;
double g( double a, double x){
    if (x>=a) return (g(a,x-1)+g(a,x-a));
    else if (x<a) return 1;
    return 0;
}
int main(){cout << g(sqrt(10000019),10000019);}

我用g(sqrt(10000019),10000019);调用该函数 如何停止SEGFAULT?

2 个答案:

答案 0 :(得分:2)

我怀疑你的seg-fault是用尽了堆栈空间。

您可以限制/不限制堆栈空间的大小(至少在Linux上) 使用tcsh中的limit命令。

% unlimit stacksize
% limit

cputime      unlimited
filesize     unlimited
datasize     unlimited
stacksize    unlimited
coredumpsize 0 kbytes
memoryuse    unlimited
vmemoryuse   unlimited
descriptors  4096 
memorylocked 64 kbytes
maxproc      1024 

然后你可以取消限制你的stacksize

private void btnLoginActionPerformed(java.awt.event.ActionEvent evt) {                                         

    try {
        File user = new File("src\\Battlefield4\\Batfield\\Users\\Username.txt"); //To create a universal file for Input & Output
        File pass = new File("src\\Battlefield4\\Batfield\\Users\\Password.txt"); //To create a universal file for Input & Output
        user.getParentFile().mkdirs(); //To denote the parent file
        pass.getParentFile().mkdirs(); //To denote the parent file
        Scanner scUser = new Scanner(user).useDelimiter("#"); //To scan the Username file
        Scanner scPass = new Scanner(pass).useDelimiter("#"); //To scan the password file
        username = txtUsername.getText(); //This gets the user input
        password = txtPassword.getText(); //This gets the user input
        int pos = 0; //Indicates the position of the Username in the save file
        boolean loggedIn = false; //Flag to check if it's logged in

        while(scUser.hasNext() && scPass.hasNext()) //Runs files in congruency
        {
            if(scUser.next().equalsIgnoreCase(username) && scPass.next().equals(password))
            {
                loggedIn = true;
                scUser.close();
                scPass.close();
                new Selection(username).setVisible(true);
                this.dispose();
                break;
            }
        }
        scUser.close();
        scPass.close();
        if(loggedIn == false)
        {
            JOptionPane.showMessageDialog(null,"Incorrect Username or Password!");
        }

    }
    catch (FileNotFoundException ex)
    {
        Logger.getLogger(Login.class.getName()).log(Level.SEVERE, null, ex);
    }

}                                        

再试一次。

答案 1 :(得分:1)

  

我有一个函数,它自称近乎无限次,但确实有一个结束。

你有无限量的堆栈内存吗?

如果不是(可能的情况),你将立即粉碎你的筹码。分段错误就是这里的明显标志。

我完全避免了递归。