例如:對于 n = 5,結果應該是:123454321。我已經設法用 2 個函式來做到這一點,它們將一個接一個地被呼叫:第一個用于將 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);
}
}
我想知道是否可以只使用一個遞回函式
uj5u.com熱心網友回復:
對的,這是可能的。以下是關于如何處理遞回問題的一般計劃:
- 當您不需要遞回呼叫時,尋找微不足道的情況
- 想象一下,你有一個函式在作業,你需要做的只是提出函式的一個額外步驟
在這里,你會發現一個簡單的模式:如果你有一個列印 2345432 的函式,你需要做的就是在它周圍列印 1。因此,您需要提供兩個數字 - thefrom和 the to。當數字相同時,您列印一份副本,然后就完成了。否則,您列印from,執行遞回呼叫,然后from再次列印。完畢!
uj5u.com熱心網友回復:
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");
}
uj5u.com熱心網友回復:
呼叫這樣的函式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);
}
uj5u.com熱心網友回復:
這是我通過使用單個遞回函式來做到這一點的方法。
#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;
}
uj5u.com熱心網友回復:
我們只需使用一個名為“work”的遞回函式即可輕松獲得該模式(https://i.stack.imgur.com/yUzJN.jpg)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/331909.html
上一篇:遞回函式如何迭代?
