以下程式生成 n 個數字的二進制數,恰好 k 個數字為“1”。這很好地完成了它的作業。
#include<stdio.h>
int n;
char arr[34] = {'\0'};
int sum = 0;
void TRY(int v) {
if (v == n) {
if (sum == 0) printf("%s\n", arr);
} else {
arr[v] = '0';
TRY(v 1);
if (sum > 0){
arr[v] = '1';
sum--;
TRY(v 1);
sum ;
}
}
}
int main() {
printf("Nhap k, n: ");
scanf("%d %d", &sum, &n);
TRY(0);
return 0;
}
但是,如果我將第 8 行替換為
if ((v==n) && (sum == 0)){
并洗掉第 9 行的校驗和 == 0,出現分段錯誤。我只想知道為什么會這樣。
uj5u.com熱心網友回復:
您會收到分段錯誤,因為您的代碼不能低于此行:
TRY(v 1);
你的基本情況
if ((v==n) && (sum == 0))
永遠不可能,true除非sum已經是 0,如果你將任何東西分配給sum0 以外的任何東西,你的基本情況將永遠不會被執行,因為它永遠不會到達sum--,因為你的基本情況不會被執行,v會繼續增加,并且在某一時刻v會變得大于大小,arr從而導致分割錯誤。
uj5u.com熱心網友回復:
哦,現在我明白了。
您的期望是當且僅當(v==n) && (sum == 0)評估為 false 時才會運行 else 分支。那是錯誤的。如果v==n為假,它將執行,無論sum. 所以支票不是等價的。
但是,printf("%s\n", arr);當且僅當(v==n) && (sum == 0)為 false 時才會執行。
我建議在這樣的情況下使用這個 printf 陳述句:
printf("sum: %d v: %d n: %d\n, sum, v, n);
然后像這樣:
void TRY(int v) {
puts("Entering TRY");
printf("sum: %d v: %d n: %d\n, sum, v, n);
if (v == n) {
puts("Entering if");
printf("sum: %d v: %d n: %d\n, sum, v, n);
if (sum == 0) printf("%s\n", arr);
} else {
puts("Entering else");
printf("sum: %d v: %d n: %d\n, sum, v, n);
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/335230.html
標籤:C
上一篇:動態加倍陣列
下一篇:撰寫迭代函式來計算數學序列
