2013-03-23 163 views
2

我知道當函數調用自己的時候,它被稱爲遞歸。但是當函數A調用調用A的函數B時,如何調用,直到有一個IF語句停止整個過程。看看這個演習從一架C書(順便說一句我能解決這個更好?)函數A調用調用函數A的函數B,你稱之爲什麼?

寫,顯示四個編號的選擇菜單和 要求您選擇一個功能。 (輸出應看起來像上面的那樣)。

編寫一個函數,它有兩個int參數:一個下限和一個 的上限。該函數應該從輸入中讀取一個整數。如果 整數超出極限,則函數應該再次打印菜單 (使用此問題的「a」部分中的函數)重新提示 用戶,然後獲得新值。當輸入正確限制的整數 時,函數應該將該值返回到調用的 函數。

使用 這個問題的部分「a」和「b」的函數編寫一個最小程序。通過最小化,我們的意思是它實際上不需要執行菜單承諾的動作 ;它應該只顯示選項並獲得有效回覆。

#include <stdio.h> 

void Display(void); 
int Limits(int a, int b); 

int main(void) 
{ 
    Display(); 
    return 0; 
} 
void Display() 
{ 
    int y = 0; 
    printf("1 - 2 - 3 - 4\n"); 
    y = Limits(0, 100); 
    if(y < 100 && y > 0) 
     printf("%d\n", y); 
} 
int Limits(int a, int b) 
{ 
    int x; 
    scanf("%d", &x); 
    if(x < a || x > b) 
     Display(); 
    return x; 
} 

OUTPUT:

1 - 2 - 3 - 4 
1234 
1 - 2 - 3 - 4 
34456 
1 - 2 - 3 - 4 
123 
1 - 2 - 3 - 4 
-34 
1 - 2 - 3 - 4 
-23 
1 - 2 - 3 - 4 
88 
88 
Press [Enter] to close the terminal ... 
+10

這就是所謂的[相互遞歸(http://en.wikipedia.org/wiki/Mutual_recursion)。 – jxh 2013-03-23 17:11:11

+0

@ user315052此外,在> 2個函數的一般情況下,[* indirect recursion *](http://en.wikipedia.org/wiki/Recursion_(computer_science)#Direct_and_indirect_recursion)。 – TC1 2013-03-23 17:12:42

+0

很高興我知道適當的條款,因爲英語不是我的第一語言,所以它很難谷歌它(功能A調用B,調用A ...) – balky 2013-03-23 17:15:45

回答

2

這就是所謂的相互遞歸或(較少)交叉遞歸。

至於如何解決乾淨它,它聽起來好像它像一個模式大致符合:

namespace { 
    int show_menu() { 
     printf("1 - 2 - 3 - 4"); 
     int n; 
     std::cin >> n; 
     return n; 
    } 
} 

int menu() { 
    int value; 
    do { 
     value = show_menu(); 
    } while (value <1 || value > 4); 
    return value; 
} 
+1

除非有明顯的問題,沒有什麼可以「解決」。這與「正常」遞歸一樣,你只需要一個終止條件。 – TC1 2013-03-23 17:18:49

+0

好多了,然後我的代碼,我的代碼是醜陋的,所以我在這裏問的修訂版 – balky 2013-03-23 17:19:08

+2

@ TC1:至少國際海事組織,有兩個可能的問題需要解決。首先,重複的錯誤輸入可能會導致程序崩潰。其次,大部分閱讀代碼的人都需要進行大量的額外研究才能確定它做了什麼,它所做的是它應該做的。 – 2013-03-23 17:20:44

相關問題