使用递归的c ++中的数字模式函数

时间:2015-10-25 19:55:44

标签: c++ recursion

使用递归实现以下函数。不要使用任何局部变量或循环。

void pattern(unsigned int n)

//前提条件:n> 0;

//后置条件:输出由整数行组成。第一行

//是数字n。下一行是2n号。下一行是

//数字4n,依此类推,直到您达到大于

的数字

// 4242.然后向后重复这个数字列表,直到你回来

//到n。

/ * n = 840的示例输出:

840

1680

3360

6720

6720

3360

1680

840 * /

//这是我的代码

#include <iostream>

using namespace std;

void pattern(unsigned int n)
{
    if(n > 0)
    {
        cout << n << endl;
        return pattern(n * 2);
    }else if( n > 4242)
    {
        return pattern(n / 2);
    }
}

int main()
{
    pattern(840);
    return 0;
}

//我的代码只是保持加倍n,它不会再分回原来的n。

5 个答案:

答案 0 :(得分:1)

其他两个答案指出了其中一个问题(只要n > 0为真,n > 4242就为真),但另一个问题是你只用{{pattern来调用n / 2 1}}如果n > 4242。所以你最终会来回“ping-ponging”。例如,在您的问题中显示的示例输出中,当您点击6720时,您将其调整为pattern(3360),但在下一次调用时,您将使用{{1}调用模式} 3360以后加倍。

我认为最明显的方法是将其拆分为两个函数并添加一个“方向”布尔值,指示您是上升还是下降:

3360 < 4242

请注意,您也可以将其拆分为3个功能:

void pattern(unsigned int n) {
   pattern_with_dir(n, true);
}

void patten_with_dir(unsigned int n, bool increase) {
    if (n <= 0) {
        return;
    }
    cout << n << endl;
    if (n > 4242) {
        pattern_with_dir(n, false);
    } else {
        if (increase) {
            pattern_with_dir(n * 2, true);
        } else {
            pattern_with_dir(n / 2, false);
        }
    }
}

但最简洁的解决方案是利用递归堆栈来帮助您倒数:

void pattern(unsigned int n) {
   pattern_up(n);
}

void pattern_up(unsigned int n) {
    cout << n << endl;
    if (n > 4242) {
        pattern_down(n);
    } else {
       pattern_up(n * 2);
    }
}

void pattern_down(unsigned int n) {
    if (n <= 0) {
        return;
    }
    cout << n << endl;
    pattern_down(n / 2);
}

答案 1 :(得分:0)

仅当if( n > 4242)不成立时才会评估

(n > 0)。但只要n > 4242为真,n > 0也是如此。

答案 2 :(得分:0)

如果是,它永远不会打到其他,因为那时第一个标准(&gt; 0)仍然是真的,它将在第一个if语句中结束。

制定第一个标准

if(n > 0 && n <= 4242) {
...
} else if(n > 4242){
...
}

或者反转if和else if

if(n > 4242) {
    return pattern(n/2);
} else if (n >0) {
    return pattern(n*2);
}

答案 3 :(得分:0)

void pattern(unsigned int n)
{
    if (n > 0)
    {
        cout << n << endl;
        if (n < 4242)
            pattern(n * 2);
        cout << n << endl;
    }
}

答案 4 :(得分:0)

// ConsoleApplication3.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <iostream>

using namespace std;

void pattern(unsigned int n)
{
    cout << n << endl;
    if (n > 4242) {
        cout << n << endl;
        return ;
    }

        pattern(n * 2);

    cout << n << endl;

    return ;
}

int _tmain(int argc, _TCHAR* argv[])
{
    pattern(840);
    return 0;
}