[英]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.