例如:对于n = 5,结果应该是:123454321。我已经设法用两个函数这样做了,它们将一个接一个地被调用:第一个用于将1打印到n,第二个用于将n-1打印到1:
void oneToN(int num)
{
if (num == 1)
printf("%d",num);
else
{
oneToN(num-1);
printf("%d",num);
}
}
void NToOne(int num)
{
if(num >= 2)
{
printf("%d", num - 1);
NToOne(num - 1);
}
}
我想知道是否可能只有一个递归函数
是有可能的。下面是关于如何处理递归问题的一般计划:
- 寻找不需要递归调用的琐碎情况
- 想象你有一个正在工作的函数,你所需要做的就是想出这个函数的一个额外步骤
在这里,您会发现一个简单的模式:如果您有一个打印2345432的函数,那么您所需要做的就是在它周围打印1。因此,您需要提供两个数字—from
和to
。当数字相同时,打印一份,就完成了。否则,打印from
,执行递归调用,然后再次打印from
。完成了!
123454321是1 + 2345432 + 1
2345432是2 + 34543 + 2
34543是3 + 454 + 3
等
看到模式了吗?
函数应该输出当前数字两次,并递归调用处理中间较大的数字。
void f(int n, int i) {
if (i == n) {
printf("%d", i);
} else {
printf("%d", i);
f(n, i + 1);
printf("%d", i);
}
}
这可以通过分解前面(或后面)的printf
来简化。
void f(int n, int i) {
printf("%d", i);
if (i < n) {
f(n, i + 1);
printf("%d", i);
}
}
在实践中我仍然会使用第二个(非递归)函数。
void _f(int n, int i) {
printf("%d", i);
if (i < n) {
_f(n, i + 1);
printf("%d", i);
}
}
void f(int n) {
if (n > 0) {
_f(n, 1);
}
printf("n");
}
使用NToOne(1, 4)
调用这样的函数应该足够了。
#include <stdio.h>
void
NToOne(int num, int max)
{
printf("%d", num);
if(num < max)
NToOne(num + 1, max);
else if (num == max)
printf("%d", num+1);
printf("%d", num);
}
void
print_1_to_n_to_1(int n)
{
NToOne(1, n-1);
}
void
main(void)
{
print_1_to_n_to_1(5);
}
我是这样做的,通过使用单个递归函数
#include<iostream>
using namespace std;
//Recursive Function
void func(int n,int i){
if(i<=n){
cout<<i;
func(n,++i);
}
if(i<=n)
cout<<i-1;
}
int main(){
int n;
cin>>n;
func(n,1);
return 0;
}
我们可以很容易地得到这种模式,只有一个递归函数叫做'work'(https://i.stack.imgur.com/yUzJN.jpg)