問題的定義是
給定一個額外的 digit
0 ≤ x ≤ 9,撰寫一個函式,該函式回傳在 n 中插入 x 所產生的整數,這樣它的數字也以從左到右的升序出現。例如,如果 n =24667和x = 5,函式應該回傳245667。
我的代碼
// the divisions are integer division, no floating point
int x(int n, int insertValue)
{
if (n == 0) return 0;
int val = x(n/10, insertValue);
if((n) > insertValue)
{
int q = insertValue * 10 (n);
return val * 100 q;
}
return val*10 (n);
}
例如,對于 的情況x(2245,3),它輸出223435。但是我在處理時已經完成了224。它不應該繼續添加要插入的值,我的意思是 3 不應該在 5 之前存在。
我可以提出一個解決方案,我可以在每個遞回步驟中放置一個布爾標志,該標志通過將模除以 10 并除以 10 來識別以達到個位數的情況。如果沒有任何標識,則進入該 if 塊,否則不。但這聽起來太傻了。
uj5u.com熱心網友回復:
當你遞回地除法時,你實際上是從右到左,而不是從左到右,所以你應該檢查一個數字是否小于插入的數字而不是更大(除非你總是讓遞回達到n==0條件并在你的方法,但那將是無效的)。
第二件事是,插入數字后不會中斷遞回(正如我現在在問題標題中看到的那樣,您已經意識到了這一點),因此它會在每個大于 的數字之前重復插入insertValue。至于如何做到這一點:您已經停止了if(n==0)條件遞回,即如果n==0函式停止呼叫自身(它立即回傳)。插入數字時,不同之處在于您需要使用原始值 ( n) 從函式回傳而不是進一步傳遞它。
在這一點上,它適用于您的示例,但如果您希望函式作業屬性,您還需要考慮一種邊界情況。當您再也沒有什么可分割的 [ if(n==0)] 時,您無論如何都需要插入您的數字 ( return insertValue),這樣它就不會像x(2245,1)通話中那樣在左邊緣丟失。
簡潔的改進:
%與*and具有相同的優先級/,因此此處不需要括號。- 我洗掉了
val變數,因為它現在只使用一次,而且它的計算并不總是必要的。
這是作業代碼:
int x(int n, int insertValue){
if(n == 0) return insertValue;
//if insertion point was found, use original value (n)
if(n <= insertValue)
return n*10 insertValue;
//if not there yet, keep calling x()
return x(n/10, insertValue)*10 n;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/335887.html
上一篇:在shell腳本中呼叫鏈碼函式
下一篇:回傳頻率元組串列,我哪里做錯了?
