我得到了這個練習(它不是家庭作業或作業,只是練習),它要求一個程式使用遞回函式將字串中的字符替換為右邊的最大字符,不允許回圈。
如果我有一個字串acbcba,函式必須回傳ccccba。
我在字串的回圈中嘗試過的一件事是,如果它有效,可能會嘗試將其轉換為遞回:
void nextGreatest(char *str, int size)
{
int max_from_right = str[size-1];
str[size-1] = -1;
for(int i = size-2; i >= 0; i--)
{
int temp = str[i];
str[i] = max_from_right;
if(max_from_right < temp)
max_from_right = temp;
}
}
Output: cccba
我認為問題在于它不計算不必替換的字符。
還有另一個使用 python 的示例,我發現并嘗試更改為 C(MAX 是此處的宏):
void nextGreatest(char *arr, int rev_i, int maxnum){
if (rev_i == strlen(arr) - 1){
arr[0] = maxnum;
return;
}
int i = strlen(arr) - 1 - rev_i;
arr[i], maxnum = maxnum, MAX(maxnum, arr[i]);
return nextGreatest(arr, rev_i 1, maxnum);
}
Output: ~bccba
uj5u.com熱心網友回復:
它不需要很難:
char nextGreatest(char *s)
{
char n;
if (!*s) return 0;
n = nextGreatest(s 1);
return *s = MAX(*s, n);
}
如果一個字符是 \0 ,那么我們已經到達了字串的末尾。否則,我們右邊有更多的字符,我們希望當前字符是它自己的值和右邊的所有值中最大的。但是由于我們按此順序呼叫該函式,因此您只需為其直接右鄰居呼叫它,因為它會依次執行相同的first。
uj5u.com熱心網友回復:
這是一個簡單的遞回問題。這個想法是,您必須遍歷整個字串以檢測最大值并保持最大值出現的索引,然后第二次遍歷字串以替換小于最大值索引的索引處的某些字符您在第一個回圈中檢測到的最大值。我為你寫了這段代碼:
#include <stdio.h>
void
replace_max_char(char*s, char **index, char *max)
{
if (!*s) return;
if (*s>=*max)
*index = s, *max = *s;
replace_max_char(s 1, index, max);
if (s<*index)
*s=*max;
}
int
main(void)
{
char s[] = "acbcba", *index, max;
replace_max_char(s, &index, &max);
printf("%s\n", s);
return 0;
}
注意if (s<*index)遞回呼叫之后的replace_max_char(s 1, index, max). 當遞回完成時,它將開始執行堆疊if...,此時已知最大值以及出現最大值的索引。
uj5u.com熱心網友回復:
將其視為一種歸納。首先定義好遞回函式該函式得到一個字符的arr并將字母從右邊切換到最大的字母。(你可以定義任何你想要的)我們將對arr的長度進行遞回(我們可以稱它為n,同樣作為感應)
base: n=0 ,只有空字符的陣列,只回傳 arr。步驟:假設我們發送長度為 n-1 的 arr 函式將起作用,那么我們需要為 n 做什么?我們只需要查看 ob 的第一個字母,然后從右邊檢查什么是最大的并切換到它。
讓我們看一個例子:對于 acbcba,如果我們呼叫較小的 arr,cbcba,回傳將是 cccba(因為我們假設它適用于 n-1),現在我們需要求解 n,所以現在我們有 arr acccba,所以我們查看第一個字母并 aee 從中得到最大的好處,然后將其回傳。
現在嘗試對其進行編碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/424934.html
上一篇:遞回行為
