关于如何退出一个递归函数而不退出整个程序的问题

XueZhaDeng_ 2013-07-14 05:59:26
关于Hmilton回游路线的问题
代码如下:
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>

int step[100] = {-1};
int chess[20][20] = {0};
int Jump[8][2] = {{-2, 1}, {-1, 2}, {1, 2}, {2, 1}, {2, -1}, {1, -2}, {-1, -2}, {-2, -1}};
int p = 0;
char s[20];
int canJump(int x, int y,int m,int n){}
int weightStep(int x, int y,int m,int n){}
void inssort(int a[], int b[], int n){}
void OutPutChess(int m,int n){}
void BackTrace(int t, int x, int y,int m,int n)
{
if (t >= m * n)
{
p++;
OutPutChess(m,n);
exit(1);
}
else
{
int i;
int count[8], possibleSteps[8];
int k = 0;
for (i = 0; i < 8; ++i)
{
if (canJump(x + Jump[i][0], y + Jump[i][1],m,n))
{
count[k] = weightStep(x + Jump[i][0], y + Jump[i][1],m,n);
possibleSteps[k++] = i;
}
}
inssort(count, possibleSteps, k);
for (i = 0; i < k; ++i)
{
int d = possibleSteps[i];
x += Jump[d][0];
y += Jump[d][1];
chess[x][y] = t + 1;
step[t] = d;
BackTrace(t + 1, x, y,m,n);
chess[x][y] = 0;
x -= Jump[d][0];
y -= Jump[d][1];
}
}
}
int main()
{
int x,y,m,n;
printf("input x and y:");
scanf("%d %d",&x,&y);
printf("input m and n:");
scanf("%d %d",&m,&n);
chess[x][y] = 1;
printf(output.txt);
BackTrace(1, x, y,m,n);
system("pause");
return 0;
}
我前面几个函数都省略了,主要是在backtrace函数中我用了回溯和递归的算法,当达到步数t>=m*n(即格子数)之后我执行exit函数,但这样我在我的win32程序中就直接退出整个程序了,不知道有什么方法能让我在win32程序中只退出这个backtrace递归函数继续执行下面的代码而不直接退出我的整个程序。
有没有大神能帮忙解决一下,在线等,急。
...全文
928 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
酱油小龟 2013-08-03
  • 打赏
  • 举报
回复
return --退出函数 exit --退出程序
一根烂笔头 2013-08-03
  • 打赏
  • 举报
回复
静态变量,计数!深入一层加1,返回一层减1.依此设定自己条件决定是否继续一些工作
fldmxp 2013-08-03
  • 打赏
  • 举报
回复
你的执行过程设计的很不好,递归里面还使用全局变量,如果你的写法风格改为传入你要计算的值,并且传入一个当前你所关心的变量值的指针,你就可以在要递归调用BackTrace时改成return BackTrace(...)了
WizardOz 2013-07-15
  • 打赏
  • 举报
回复

int BackTrace(int t, int x, int y,int m,int n)
{
    if (t >= m * n)
    {
        p++;
        OutPutChess(m,n);
        ///////////////////////////
        return 1;
    }
    else
    {
        int i;
        int count[8], possibleSteps[8];
        int k = 0;
        for (i = 0; i < 8; ++i)
        {
            if (canJump(x + Jump[i][0], y + Jump[i][1],m,n))
            {
                count[k] = weightStep(x + Jump[i][0], y + Jump[i][1],m,n);
                possibleSteps[k++] = i;  
            }
        }    
        inssort(count, possibleSteps, k);
        for (i = 0; i < k; ++i)
        {
            int d = possibleSteps[i];
            x += Jump[d][0];
            y += Jump[d][1];
            chess[x][y] = t + 1;
            step[t] = d;

            //////////////////////////////////
            if (1 == BackTrace(t + 1, x, y,m,n)) {
                return 1;
            }

            chess[x][y] = 0;
            x -= Jump[d][0];
            y -= Jump[d][1];
         }
    }
}
WizardOz 2013-07-15
  • 打赏
  • 举报
回复
引用 4 楼 XueZhaDeng_ 的回复:
[quote=引用 3 楼 conquerwave 的回复:] 逻辑有问题吧,断点看看哪个变量没出阀值
没问题,我单独运行这些函数是能在DOS上成功运行的,但是我要把这写加在win32程序里到了递归那一步就出不来了,主要就是想问一下如何跳出递归..[/quote] 如果递归无法返回,那一定是逻辑设计有问题。世界上没有绝对没问题的代码,在一种特定的条件下能运行,不代表代码就是对的。
  • 打赏
  • 举报
回复
C setjmp longjmp C++ try catch throw
milaoshu1020 2013-07-15
  • 打赏
  • 举报
回复
最简单的:Exception. 复杂一点的,递归调用时判断返回值,如果为特定值就直接返回,不执行下边的代码。
XueZhaDeng_ 2013-07-14
  • 打赏
  • 举报
回复
引用 3 楼 conquerwave 的回复:
逻辑有问题吧,断点看看哪个变量没出阀值
没问题,我单独运行这些函数是能在DOS上成功运行的,但是我要把这写加在win32程序里到了递归那一步就出不来了,主要就是想问一下如何跳出递归..
conquerwave 2013-07-14
  • 打赏
  • 举报
回复
逻辑有问题吧,断点看看哪个变量没出阀值
XueZhaDeng_ 2013-07-14
  • 打赏
  • 举报
回复
引用 1 楼 qzf362269994 的回复:
把exit(1)改为return ; 试试
试过,不行,仍然还在递归..
qzf362269994 2013-07-14
  • 打赏
  • 举报
回复
把exit(1)改为return ; 试试

70,014

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧