簡體   English   中英

使用遞歸的c ++中的數字模式函數

[英]Number Pattern Function in c++ using recursion

使用遞歸實現以下功能。 不要使用任何局部變量或循環。

無效模式(無符號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。

其他兩個答案指出了其中一個問題(只要n > 4242為true,則n > 0為true),但是另一個問題是,如果n > 4242則僅調用n / 2 pattern 因此,您最終會來回“乒乓”。 例如,在問題中顯示的示例輸出中,當您擊中6720時,您6720減半以調用pattern(3360) ,但是在下一次調用中,您將以3360翻倍的方式調用pattern,因為3360 < 4242

我認為執行此操作的最明顯方法是將其拆分為兩個函數,並添加一個“方向”布爾值,指示您是向上還是向下:

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);
        }
    }
}

請注意,您還可以將其分為3個功能:

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);
}

但是最簡潔的解決方案是利用遞歸堆棧來幫助您倒數:

void pattern(unsigned int n) {
   // Going up
   count << n << endl;
   if (n <= 4242) {
       pattern(n*2);
   }
   // this will be called "on the way back down"
   count << n << endl;
}

僅當(n > 0)不為真時,才會評估if( n > 4242) 但是只要n > 4242為真, n > 0就會為真。

if永遠不會命中else,因為第一個條件(> 0)仍然為true,它將在第一個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);
}
void pattern(unsigned int n)
{
    if (n > 0)
    {
        cout << n << endl;
        if (n < 4242)
            pattern(n * 2);
        cout << n << endl;
    }
}
// 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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM