在c語言中,在使用遞回時,請問如何判斷是否為最后一層呼叫?
uj5u.com熱心網友回復:
如何判斷是你自己設定的比如
func(int n){
if(n==1)return;
else{……}
func(n-1)
}
那么當n=1時,就達到底層,開始回傳
uj5u.com熱心網友回復:
就是我在回傳的時候,到最后一層函式時我需要回傳的值跟前面的演算法不一致,所以我需要判斷一下寫不同演算法。
uj5u.com熱心網友回復:
我說的不對,不是最后一層,其實是指的最開始第一次的主調函式,回傳的時候如何判斷到達了最開始的主調函式
uj5u.com熱心網友回復:
那就在那個return前面實作你的演算法啊,一個是if,一個是else,不區分的好好的嗎uj5u.com熱心網友回復:
就是不知道if里面的條件該寫啥,不知道怎么判斷回傳到了第一層主調uj5u.com熱心網友回復:
那要看你的遞回結束條件啊,有return的就是遞回結束條件,有遞回呼叫的不是遞回結束條件uj5u.com熱心網友回復:
除了主調,我每層函式都會回傳一個用同樣演算法得到的值,但是在主調里面得到的值的演算法卻不一樣,不知道要怎么判斷是否到達了主調,這就是if里面要寫的內容。uj5u.com熱心網友回復:
好吧,回到地面可以判斷的方法也有很多,最簡單的你可以記住進入第二層前第一層某個變數的值,最好就是傳入的引數,因為每遞回一次,這個引數變一次,記住第一層那個變數的值,當該變數的值又回到該值的時候就到地面了我感覺這說的漏洞挺多的,但這個想法是可以實作的
話說為毛Linux下不能洗掉我的回帖了
uj5u.com熱心網友回復:
我的問題就是第一次的那個引數值怎么保存啊,每次都會變,而且我的函式引數已經定了就只能傳那一個不能變uj5u.com熱心網友回復:
別人給的介面就只能傳那一個引數,不知道怎么存uj5u.com熱心網友回復:
遞回是函式里面使用不同的引數來呼叫自身,當然也有a呼叫b,b再呼叫a的這種遞回int sum(int n) { return n + sum(n-1); };
sum(3)
sum(2)
sum(1)
sum(0)
sum(-1)
.....
沒完沒了啦啊, 最終堆疊溢位,game over!
怎么辦啊, 什么時候到底呢?
改改代碼
int sum(n) { if (n==0) return 0; else return n+sum(n-1); }.
這樣就是n為0的時候, 就到底了, 不用深入了, 開始一層層的回傳了
sum(3)
sum(2)
sum(1)
sum(0) return 0
return 1+sum(0)return的結果
return 2+ sum(1)return的結果
return 3+sum(2)return的結果
樓主的問題是想在sum當中如何知道,是從sum(3)開始呼叫的
做個全域變數唄, 既然sum函式自身的引數和區域變數都是每次被他人所初始化的,那就借助外力唄, 從全域變數來解決
呼叫sum(3)之前,把這個全域變數賦值3, 然后sum里面判斷n和3是否相同就知道了是不是第一層了
不用全域,用區域靜態變數也可以,但是這樣的話, 這個遞回函式本身在主函式當中也只能呼叫一次才行
uj5u.com熱心網友回復:
遞回是函式里面使用不同的引數來呼叫自身,當然也有a呼叫b,b再呼叫a的這種遞回
int sum(int n) { return n + sum(n-1); };
sum(3)
sum(2)
sum(1)
sum(0)
sum(-1)
.....
沒完沒了啦啊, 最終堆疊溢位,game over!
怎么辦啊, 什么時候到底呢?
改改代碼
int sum(n) { if (n==0) return 0; else return n+sum(n-1); }.
這樣就是n為0的時候, 就到底了, 不用深入了, 開始一層層的回傳了
sum(3)
sum(2)
sum(1)
sum(0) return 0
return 1+sum(0)return的結果
return 2+ sum(1)return的結果
return 3+sum(2)return的結果
樓主的問題是想在sum當中如何知道,是從sum(3)開始呼叫的
做個全域變數唄, 既然sum函式自身的引數和區域變數都是每次被他人所初始化的,那就借助外力唄, 從全域變數來解決
呼叫sum(3)之前,把這個全域變數賦值3, 然后sum里面判斷n和3是否相同就知道了是不是第一層了
不用全域,用區域靜態變數也可以,但是這樣的話, 這個遞回函式本身在主函式當中也只能呼叫一次才行
謝謝您了,可這個引數是需要用戶輸入的,呼叫輸入的陳述句是在主函式里,這樣的話需在主函式里就將全域變數賦值,或者在主函式中就申請全域變數,但我這個程式不能改變主函式,主函式也是人家給的,不能更改。
uj5u.com熱心網友回復:
你一定要知道那一層是第一層的必要性是什么呢?!你可以這樣
int sum(int n) {
static int flag = 0;
flag++;
if (0==n) return 0; else return n + sum(n-1);
}
根據flag的值, 值是1的就是第一層了。
用區域的static變數替代全域的。
uj5u.com熱心網友回復:
主要是我在回傳到第一層的時候想要執行不同演算法,函式介面又規定了不能變動,函式區域靜態變數可以解決,可統計呼叫層數。在遞回呼叫之前進行flag++,呼叫之后回傳時又進行flag--,當flag為1時即又回到了第一層。謝謝您了轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/140667.html
標籤:工具平臺和程序庫
下一篇:麻煩大佬看一下
