使用递归实现以下函数。不要使用任何局部变量或循环。
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。
答案 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;
}