#include <stdio.h>
#include <stdlib.h>
int a[10],book[10],n;
void dfs(int step)
{
int i;
if(step==n+1) //判斷是否為第n+1個盒子,那么前面n個盒子已經放好牌了
{
//輸出一種排列
for(i=1;i<=n;i++)
printf("%d",a[i]);
printf("\n");
return; //回傳之前的一步,也就是上一次呼叫dfs函式的地方
}
//每次按從小到大放排
for(i=1;i<=n;i++)
if(book[i]==0) //第i張牌未被使用過
{
a[step]=i; //將牌放到第step個盒子中
book[i]=1; //標記已被使用過
dfs(step+1); //進行下一個盒子
book[i]=0; //將剛剛嘗試的撲克牌識訓,好進行下一次嘗試,這一步非常重要!!!!
}
return;
}
int main()
{
scanf("%d",&n); //n要在1~9之間
dfs(1); //首先站在一號盒子前面
return 0;
}
如上,將 i 在dfs中宣告時 輸入n為3
輸出為3的全排列
但將 i 作為全域變數的時候就只能輸出 123了
這是為什么啊
uj5u.com熱心網友回復:
因為如果定義成區域變數,那每次呼叫dfs時,都會創建一個i,第一層中的i和第二層中的沒關系如果定義成全域的,每一層中的i都是同一個,這一層中i變了,下一層也會變化,所以下層中的回圈會“提前”結束
如有問題歡迎繼續追問,沒問題請及時結貼,謝謝
uj5u.com熱心網友回復:
為什么感覺這么憋屈,不知道要怎么跟你說呢。。大概是因為你的問題是“定義為全域變數,和定義為區域變數為什么差距這么大?”,而不是“全域變數和區域變數的區別是什么?”。首先我想問你,你理解的全域變數,和區域變數,是什么樣的一個區別?
然后,你是否已經完全的理解了你這段代碼的含義?
你如果都理解正確,我覺得不應該還會有這樣的疑問。
單純的說下這個問題的原因:
如果你把 i 宣告為全域變數,顯然是不行的,你每次dfs呼叫都會改變 i 的值,那么回傳到回圈中后,其作為索引的意義就已經被破壞了。
吐槽一下。。
如果把你的例子來說明 全域變數和區域變數的區別,那給我的感覺就像是下面這樣的場景:
說有一輛公交車,始發站時有n個人,到達第一站后上了2個人,下了1個人,到達第二站后,上了3個人下了2個人,…………(此處省略1千字),到達第m站,上了m+1個人,下了m個人。
當我讀完題目,正要愉快的給出 車上還剩幾個人的時候,結果問題卻是,這輛公交車一共經過了幾站。。。。。
不知道你有沒有懂我想表達的意思。
uj5u.com熱心網友回復:
因為你函式有遞回呼叫,如果是區域變數,每次呼叫的i都是相互獨立的。而如果是全域變數,則是同樣的i
uj5u.com熱心網友回復:
區域變數每次呼叫函式都不是同一個,全域變數則是同一個uj5u.com熱心網友回復:
謝謝啦,本來好苦惱的,終于找到答案了,看完有種恍然大悟的感覺,講得真的很好


轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/248680.html
標籤:C語言
下一篇:小白求各路大神救
