2013-03-23 165 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

相关问题