我还是编程新手,所以如果有任何不好的话,请容忍我糟糕的语法和逻辑。我在C中编写了一个密码算术解算器。它从用户读取3个单词,计算它们的值并将它们打印到屏幕上。 (例如send+more=money
- > 9567+1085=10652
)
我尝试了类似于置换算法的东西。它可以进行计算,但对于某些输入,结果会多次打印:
如何修改我的代码,以便首次处理if (n1+n2==n3)
下的printf命令,递归结束,程序返回main
函数?
/* Swaps the two elements of an array. */
void swap(int v[], int i, int j) {
int t;
t = v[i];
v[i] = v[j];
v[j] = t;
}
/* Solves the Cryptarithmetic puzzle. */
int solve(int v[], int n, int i, char s1[], char s2[], char s3[], char letters[]) {
int k, m, j, t = 0, power, n1 = 0, n2 = 0, n3 = 0;
if (i == n) {
/*....some codes that
* calculate the value of each input word.....*/
/*This part verifies the values and if they are correct, prints them to screen*/
if (n1 + n2 == n3) {
printf("found!\n");
printf("\n%s : %6d\n", s1, n1);
printf("%s : %6d\n", s2, n2);
printf("%s : %6d\n", s3, n3);
}
} else
for (j = i; j < n; j++) {
swap(v, i, j);
solve(v, n, i + 1, s1, s2, s3, letters);
swap(v, i, j);
}
}
答案 0 :(得分:2)
需要进行三项更改。首先,一旦你解决了它,你需要返回一些东西:
printf ("%s : %6d\n", s3 , n3);
return 1;
接下来,您需要在递归时检查返回值,如果找到解决方案则停止:
if (solve (v, n, i+1,s1,s2,s3,letters))
return 1;
最后,如果找不到解决方案,则需要返回0:
}
return 0;
}
答案 1 :(得分:1)
您可以使用setjmp()/longjmp()
。为此你需要:
#include <setjmp.h>
然后是一个全局变量:
jmp_buf env;
然后在main(或你称之为递归函数的任何地方),你做:
if(!setjmp(env)) recursiveSolve();
然后当你找到解决方案时:
if(solutionFound) longjmp(env, 1);
它将返回主要状态,就像没有发生任何事情一样 - 但是找到了你的解决方案。